gpt4 book ai didi

java - 尝试使用 OCI 连接到 Oracle 时 JVM 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:59:03 25 4
gpt4 key购买 nike

我的三台机器设置如下:

  • CompA:运行 Oracle 服务器 10.2.0.3
  • CompB:运行 Oracle 服务器 10.2.0.4 和我的客户端代码
  • CompC:仅运行客户端代码

在 CompB 和 CompC 上的客户端代码上,使用 Thin 驱动程序连接到 Oracle DB 都可以完美地工作。

我正在尝试通过 OCI 驱动程序从客户端代码连接到每个 Oracle 数据库

Connection conn = DriverManager.getConnection('jdbc:oracle:oci:username/pass@sid');

来自在 jboss 中运行的 Java 类内部。这在 CompB 上工作得很好,但会导致运行 Jboss 的 JVM 每次在 CompC 上进行核心转储。

CompC 可以使用 Sql*Plus 和 jboss 尝试引用的同一个 tnsnames.ora 文件连接到两个 Oracle 服务器。

这是堆栈跟踪的一部分。它似乎每次都是一致的。

Stack: [0x30fcc000,0x3101d000),  sp=0x3101a868,  free space=314kNative frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)V  [libjvm.so+0x2d02d6]C  [libocijdbc10.so+0x585c]C  [libocijdbc10.so+0x70a8]  Java_oracle_jdbc_driver_T2CConnection_t2cCreateState+0x15cj  oracle.jdbc.driver.T2CConnection.t2cCreateState([BI[BI[BI[BISI[S[B[B)I+0j  oracle.jdbc.driver.T2CConnection.logon()V+551j  oracle.jdbc.driver.PhysicalConnection.(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;Loracle/jdbc/driver/OracleDriverExtension;)V+381j  oracle.jdbc.driver.T2CConnection.(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;Loracle/jdbc/driver/OracleDriverExtension;)V+10j  oracle.jdbc.driver.T2CDriverExtension.getConnection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;+67j  oracle.jdbc.driver.OracleDriver.connect(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;+831j  java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/util/Properties;Ljava/lang/ClassLoader;)Ljava/sql/Connection;+210j  java.sql.DriverManager.getConnection(Ljava/lang/String;)Ljava/sql/Connection;+15

有谁知道这里出了什么问题吗?

更新:为澄清起见,上面使用的“客户端”指的是我在 jboss 实例中运行的 java 代码。应该在 jboss 启动的 LD_LIBRARY_PATH 中找到的唯一 Oracle 库是 libocijdbc10.so libclntsh.so.10.1 和 libnnz10.so。这三个库和 jboss 服务器本身在源代码控制中,因此它们在 CompB 和 CompC 上的版本相同。

CompB 可以使用 OCI 和 thin 连接到 CompA 和 CompB。 CompC 无法使用 OCI 连接,但可以使用 thin 连接到 CompA 和 CompB,因此这应该不是服务器版本问题。

CompB 和 CompC 都运行 32 位 Ubuntu 8.04,尽管 CompC 的 CPU 稍慢并且只有 1GB 内存,而 CompB 有 3.25GB 内存。

最佳答案

好吧,我刚看完一集《豪斯》,所以让我们在这里尝试一下鉴别诊断。您知道它适用于两台机器的瘦驱动程序,但它在 JBoss 代码中已过期。您不确定(“客户端”不是很确定)但是看起来您在 CompB 和 CompC 上都有一个 JBoss 实例,并且您的代码在 CompB 上的 JBoss 实例中运行时运行愉快,但核心转储来自 CompC。

从设置中,我推断当您在 CompB 上运行时,您正在与 CompB 上的 Oracle 实例对话。您是否尝试过在 CompB 上运行代码但与 CompA 交谈?您是否尝试过在 CompC 上运行代码,但在 CompB 上与 Oracle 对话?

实际错误表明 dynlib 模块“libocijdbc10.so”中的 native 代码中出现错误,我们知道您在 CompA 和 CompB 上有不同版本的 Oracle 东西。所以我的第一个怀疑是两台机器上的 libocijdbc10.so 版本不兼容。我发现您在 CompA 和 CompB 上有不同版本的 Oracle。我预测 CompB 上与 CompA 的 oracle 对话的代码将失败,而 CompC 上与 CompB 对话的代码将运行。

您想检查 CompB 和 CompC 上的 Oracle OCI 驱动程序软件的版本。

更新

好吧,你说:

CompB can connect, using OCI and thin,to both CompA and CompB. CompC cannotconnect using OCI, but can connectusing thin, to both CompA and CompB,so it shouldn't be a server versionissue.

所以,您已经缩小了范围。三种连接方法(Thin、SQL*Plus 和 OCI)和三台服务器,唯一失败的是使用来自 CompC 的 OCI;无法与 CompA 和 CompB 对话。

接下来的问题是 CompC JBoss 上的配置问题。它仍然 Oracle 提供的驱动程序失败;由于相同的代码在 CompB 上运行时对 CompA 和 CompB 起作用,所以它必须是 CompC 问题,而不是您的代码中的问题。

所以

  1. 对驱动程序运行cmp(1)来自 CompB 和 CompC 的库并确认它们相同。
  2. 当他们不在的时候,rcp 驱动程序从 CompB 到 CompC 并进行测试。
  3. 找出问题出在哪里配置控制。

关于java - 尝试使用 OCI 连接到 Oracle 时 JVM 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/679684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com