我有三台机器设置如下:
在CompB和CompC上的客户端代码上,使用Thin驱动程序可以完美地连接到Oracle DB。
我正在尝试使用
通过OCI驱动程序从客户端代码连接到每个Oracle DBConnection conn = DriverManager.getConnection('jdbc:oracle:oci:username/pass@sid');
从jboss中运行的Java类内部。这在CompB上运行得很好,但是每次在CompC上运行Jboss的JVM都会进行核心转储。
CompC可以使用Sql * Plus和jboss试图引用的相同tnsnames.ora文件连接到两个Oracle服务器。
这是堆栈跟踪的一部分。它似乎每次都是一致的。
Stack: [0x30fcc000,0x3101d000), sp=0x3101a868, free space=314k Native 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+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
有谁知道这里出了什么问题?
更新:为了澄清,上面使用的“client”是指我在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进行连接,但可以使用瘦连接到CompA和CompB,因此它不应该是服务器版本问题。
CompB和CompC都在运行32位Ubuntu 8.04,尽管CompC的CPU速度稍慢,只有1GB的RAM,而CompB的RAM为3.25GB。
答案 0 :(得分:4)
好吧,我刚看完House的一集,所以让我们在这里试一下鉴别诊断。您知道它可以与两台机器上的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的oracle交谈的代码将失败,并且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上的配置问题。它仍然在 in Oracle提供的驱动程序中失败;因为在CompB上运行时,相同的代码对CompA和CompB起作用,所以它必须是CompC问题,而不是代码中的问题。
所以
答案 1 :(得分:2)
放弃原生OCI驱动程序 - 这是一个永无止境的头痛。
使用纯Java驱动程序 - 它更稳定,更快速并且使用更少的内存。