我有三台机器,设置如下:

  • 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连接,但是可以使用瘦连接到CompA和CompB,因此这不应该是服务器版本问题。

    CompB和CompC都在运行32位Ubuntu 8.04,尽管CompC的CPU速度稍慢,只有1GB的RAM,而CompB上为3.25GB的RAM。

    最佳答案

    好吧,我刚刚看完《 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。我预计与CompA的oracle对话的CompB上的代码将失败,并且与CompB对话的CompC上的代码将运行。
    您要检查CompB和CompC上Oracle OCI驱动程序软件的版本。
    更新资料
    好吧,你说:

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

    因此,您已经缩小了范围。三种连接方法(Thin,SQL * Plus和OCI)和三台服务器,唯一失败的方法是使用CompC中的OCI。无法与CompA和CompB通话。
    随之而来的问题是CompC JBoss上的配置问题。在Oracle提供的驱动程序中仍然失败。由于在CompB上运行时,相同的代码对CompA和CompB起作用,因此它必须是CompC问题,而不是代码中的问题。
    所以

  • 对驱动程序运行cmp(1)
    CompB和CompC中的库
    并确认它们相同。
  • 不在时,通过rcp驱动程序
    从CompB到CompC并进行测试。
  • 找出问题出在哪里
    配置控制。
  • 关于java - 尝试使用OCI连接到Oracle时JVM崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/679684/

    10-10 05:46