本文介绍了为什么我会收到“格式错误:属性为'v $ session.program'";连接到Oracle?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从Java应用程序连接到Oracle 11g数据库.我收到以下异常:

I'm connecting to an Oracle 11g database from a Java application. I'm getting the following exception:

Caused by: java.sql.SQLException: Connection property: format error: Property is 'v$session.program' and value is '<My Maven application's name>'
at oracle.jdbc.driver.T4CConnection.validateConnectionProperties(T4CConnection.java:4540)
at oracle.jdbc.driver.PhysicalConnection.readConnectionProperties(PhysicalConnection.java:2345)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:517)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:280)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:207)
at oracle.ucp.jdbc.DataSourceConnectionFactoryAdapter.createConnection(DataSourceConnectionFactoryAdapter.java:100)

我该如何解决?

推荐答案

我们知道了.我们的应用程序名称太长了一个字符:它是49个字符,而不是48个字符或更少.

We figured it out. Our application name was one character too long: it was 49 characters instead of 48 or fewer.

以下是v$session属性及其长度限制的列表:

Here's a list of the v$session properties and their length limits:

  • v$session.machine:64
  • v$session.iname:没有限制
  • v$session.ename:没有限制
  • v$session.process:24
  • v$session.program:48
  • v$session.terminal:30
  • v$session.osuer:30
  • v$session.machine: 64
  • v$session.iname: no limit
  • v$session.ename: no limit
  • v$session.process: 24
  • v$session.program: 48
  • v$session.terminal: 30
  • v$session.osuer: 30

此外,所有属性都不能匹配此正则表达式:.*[\00\(\)].*,我认为这意味着没有括号.

Also, none of the properties can match this regex: .*[\00\(\)].*, which I think means no parentheses.

如果遇到错误并想查看代码,只需在IDE中为SQLException添加一个异常断点.您应该在名为T4CConnection.class的类中结束.

If you are getting the error and want to see the code, just add an exception breakpoint in your IDE for SQLException. You should end up in a class called T4CConnection.class.

这是方法validateConnectionProperties()的反编译代码:

Here's the decompiled code for the method, validateConnectionProperties():

void validateConnectionProperties() throws SQLException {
    super.validateConnectionProperties();
    String var1 = ".*[\\00\\(\\)].*";
    SQLException var2;
    if(this.thinVsessionOsuser == null || !this.thinVsessionOsuser.matches(var1) && this.thinVsessionOsuser.length() <= 30) {
        if(this.thinVsessionTerminal == null || !this.thinVsessionTerminal.matches(var1) && this.thinVsessionTerminal.length() <= 30) {
            if(this.thinVsessionMachine != null && (this.thinVsessionMachine.matches(var1) || this.thinVsessionMachine.length() > 64)) {
                var2 = DatabaseError.createSqlException((OracleConnection)null, 190, "Property is \'v$session.machine\' and value is \'" + this.thinVsessionMachine + "\'");
                var2.fillInStackTrace();
                throw var2;
            } else if(this.thinVsessionProgram == null || !this.thinVsessionProgram.matches(var1) && this.thinVsessionProgram.length() <= 48) {
                if(this.thinVsessionProcess == null || !this.thinVsessionProcess.matches(var1) && this.thinVsessionProcess.length() <= 24) {
                    if(this.thinVsessionIname != null && this.thinVsessionIname.matches(var1)) {
                        var2 = DatabaseError.createSqlException((OracleConnection)null, 190, "Property is \'v$session.iname\' and value is \'" + this.thinVsessionIname + "\'");
                        var2.fillInStackTrace();
                        throw var2;
                    } else if(this.thinVsessionEname != null && this.thinVsessionEname.matches(var1)) {
                        var2 = DatabaseError.createSqlException((OracleConnection)null, 190, "Property is \'v$session.ename\' and value is \'" + this.thinVsessionEname + "\'");
                        var2.fillInStackTrace();
                        throw var2;
                    }
                } else {
                    var2 = DatabaseError.createSqlException((OracleConnection)null, 190, "Property is \'v$session.process\' and value is \'" + this.thinVsessionProcess + "\'");
                    var2.fillInStackTrace();
                    throw var2;
                }
            } else {
                var2 = DatabaseError.createSqlException((OracleConnection)null, 190, "Property is \'v$session.program\' and value is \'" + this.thinVsessionProgram + "\'");
                var2.fillInStackTrace();
                throw var2;
            }
        } else {
            var2 = DatabaseError.createSqlException((OracleConnection)null, 190, "Property is \'v$session.terminal\' and value is \'" + this.thinVsessionTerminal + "\'");
            var2.fillInStackTrace();
            throw var2;
        }
    } else {
        var2 = DatabaseError.createSqlException((OracleConnection)null, 190, "Property is \'v$session.osuser\' and value is \'" + this.thinVsessionOsuser + "\'");
        var2.fillInStackTrace();
        throw var2;
    }
}

这篇关于为什么我会收到“格式错误:属性为'v $ session.program'";连接到Oracle?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 03:15