7

我目前正在使用 Oracle 中的 Java 存储过程,并且在尝试在我的 Java 代码中建立连接时看到一些奇怪的行为。

我的 Java 被打包成一个 jar 文件,然后使用loadjava命令行实用程序部署到 Oracle 中。package然后在数据库中创建A ,它将指定 Java 类中的每个方法通过调用规范映射到 PL/SQL 函数。

我正在使用的一些列是CLOBs。在 Java 中,我尝试将 this 的值CLOB(在调用规范中映射为oracle.sql.CLOB)提取到 a中String

private static String getStringFromCLOB(CLOB clob) throws SQLException {
    long length = clob.length();
    return clob.getSubString(1, (int) length);
}

当我运行此代码时,我会在 SQL*Plus 中看到以下堆栈跟踪:

java.lang.ArithmeticException: / by zero
    at oracle.jdbc.driver.T2SConnection.<init>(T2SConnection.java:107)
    at oracle.jdbc.driver.T2SDriverExtension.getConnection(T2SDriverExtension.java:31)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:481)
    at oracle.jdbc.driver.OracleDriver.defaultConnection(OracleDriver.java:505)
    at oracle.sql.DatumWithConnection.getPhysicalConnection(DatumWithConnection.java:53)
    at oracle.sql.DatumWithConnection.getInternalConnection(DatumWithConnection.java:177)
    at oracle.sql.CLOB.getDBAccess(CLOB.java:1383)
    at oracle.sql.CLOB.length(CLOB.java:197)

在我刚刚看到的消息之前,Exception我用 a 包装了有问题的方法的内容,try / catch这样我就可以将完整的堆栈跟踪转储到System.out.

值得注意的是,我已经在 Oracle 11.2.0.1.0 (32bit) 上运行了这个,但它不适用于 Oracle 11.2.0.2.0 (64bit)

我也有其他支持 Java 的 PL/SQLfunction正常工作。只有那些试图建立连接的人才会失败。

我看过了<ORACLE_HOME>\jdbc\lib,这些罐子虽然名称相同,但在这两个发行版中似乎有所不同。目录中的 jars 是(显示 11.2.0.1.0 大小和 11.2.0.2.0 大小):

  • ojdbc5.jar(1,950KB | 1,983KB)
  • ojdbc5_g.jar(3,010KB | 3,271KB)
  • ojdbc5dms.jar(2,374KB | 2,489KB)
  • ojdbc5dms_g.jar(3,030KB | 3,291KB)
  • ojdbc6.jar(2,062KB | 2,102KB)
  • ojdbc6_g.jar(3,323KB | 3,782KB)
  • ojdbc6dms.jar(2,594KB | 2,698KB)
  • ojdbc6dms_g.jar(3,344KB | 3,805KB)
  • simplefan.jar(20KB | 20KB) <-- 可能相同

这些 jar 的清单文件确认它们是为特定版本构建的,即 11.2.0.1.0 或 11.2.0.2.0。11.2.0.2.0 中是否可能引入了错误?还是更有可能是用户,即我的错误:-)

另外,oracle.jdbc.driver.T2SConnection班级住在哪里?

非常感谢任何帮助/指导。如果您需要更多信息,请告诉我。

4

4 回答 4

5

当我的密码到期时,我遇到了这个问题。我解决了这个只是更改密码。

于 2016-06-27T13:44:26.320 回答
2

最近的 Oracle JDBC 驱动程序有类似的问题。我们的案例似乎是混合来自不同版本的 jar 的问题,例如 11.2.0.1 和 11.2.0.3,例如来自 11.2.0.1 的 ojdbc6.jar 和来自 11.2.0.3 的 oi18n.jar。一种不错的技术是反编译 Oracle JDBC 驱动程序的整个 jar,并查看源代码中引发错误的行。可以提供有关错误/错误的提示。

尝试在两台客户端机器上使用相同的 JDBC 驱动程序版本。

oracle.jdbc.driver.T2CConnection存在于驱动程序的任何主 jar 中,例如 ojdbc5.jar。

于 2012-06-11T17:54:45.657 回答
1

我的 Java/JDBC 代码一天一天地突然停止工作。

这里同样的问题。密码过期。我尝试了 ojdbc6 和 ojdbc7。升级了我的虚拟机环境。该代码对不同的数据库运行良好。

target_user="c##ora$rman_bkp"
Placeholder START_DATE=20170422
Placeholder START_DATE_TIME=2017Apr22-20h47m13s
jdbcURL='jdbc:oracle:oci8:@twelve_static'
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1387)
        at oracle.jdbc.driver.T2CPreparedStatement.<init>(T2CPreparedStatement.java:109)
        at oracle.jdbc.driver.T2CDriverExtension.allocatePreparedStatement(T2CDriverExtension.java:81)
        at oracle.jdbc.driver.PhysicalConnection.prepareStatementInternal(PhysicalConnection.java:2013)
        at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1960)
        at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57)
        at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1866)
        at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57)
        at LV.verifyLicensedDbId(LV.java:238)
        at RmanJ.<init>(RmanJ.java:1891)
        at RmanJ.main(RmanJ.java:1809)

SYS@TWELVE:SQL> select account_status from dba_users where username='c##ora$rman_bkp';

ACCOUNT_STATUS
--------------------------------
EXPIRED(GRACE)

SYS@TWELVE:SQL> connect "c##ora$rman_bkp"
Enter password:
ERROR:
ORA-28002: the password will expire within 5 days


Connected.
c##ora$rman_bkp@TWELVE:SQL> password
Changing password for "c##ora$rman_bkp"
Old password:
New password:
Retype new password:
Password changed

测试了我的代码,它再次正常工作。甲骨文软件中的另一个令人难以置信的错误。他们的质量保证永远不会正确。我绝对相信他们甚至没有适当的测试计划,否则他们会遇到严重的错误,例如过期密码被零除。

于 2017-04-22T19:09:53.013 回答
0

对于那些可能遇到此问题的人,我们发现它是由 Oracle 中的 JVM 安装损坏引起的。这可能是由于安装不当造成的。

重新安装 Oracle 的 JVM 方面允许oracle.jdbc.driver.OracleConnection.defaultConnection()运行而没有任何问题,无论是显式调用还是作为另一个调用的堆栈的一部分调用,例如oracle.sql.CLOB.length().

于 2012-08-31T09:10:36.780 回答