3

我有三台机器设置如下:

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

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

我正在尝试使用 OCI 驱动程序从客户端代码连接到每个 Oracle DB

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

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

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

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

堆栈:[0x30fcc000,0x3101d000),sp=0x3101a868,可用空间=314k
本机帧:(J=编译的 Java 代码,j=解释的,Vv=VM 代码,C=本机代码)
V [libjvm.so+0x2d02d6]
C [libocijdbc10.so+0x585c]
C [libocijdbc10.so+0x70a8] Java_oracle_jdbc_driver_T2CConnection_t2cCreateState+0x15c
j oracle.jdbc.driver.T2CConnection.t2cCreateState([BI[BI[BI[BISI[S[B[B]I+0]
j oracle.jdbc.driver.T2CConnection.logon()V+551
j oracle.jdbc.driver.PhysicalConnection.(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;Loracle/jdbc/driver/OracleDriverExtension;)V +381
j oracle.jdbc.driver.T2CConnection.(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;Loracle/jdbc/driver/OracleDriverExtension;)V +10
j oracle.jdbc.driver.T2CDriverExtension.getConnection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;+67
j oracle.jdbc.driver.OracleDriver.connect(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;+831
j java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/util/Properties;Ljava/lang/ClassLoader;)Ljava/sql/Connection;+210
j 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 的 RAM,而 CompB 的 RAM 为 3.25GB。

4

2 回答 2

4

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

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

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

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

更新

好吧,你说:

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

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

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

所以

  1. 对来自 CompB 和 CompC 的驱动程序库运行cmp(1)并确认它们是相同的。
  2. 如果不是,则将 CompB 中的驱动程序 rcp 到 CompC 上并进行测试。
  3. 找出配置控制出了什么问题。
于 2009-03-25T03:00:14.153 回答
2

放弃本机 OCI 驱动程序 - 这是一个永无止境的头痛。

使用纯 java 驱动程序——它更稳定、更快并且使用更少的内存。

于 2009-03-25T21:49:34.750 回答