代码之家  ›  专栏  ›  技术社区  ›  Ryan Ahearn

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

  •  3
  • Ryan Ahearn  · 技术社区  · 15 年前

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

    我正试图通过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服务器。

    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_路径中可以找到的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上只有3.25GB的RAM。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Charlie Martin    15 年前

    嗯,我刚看完《豪斯》的一集,让我们来试试鉴别诊断。您知道它可以与两台机器上的瘦驱动程序一起工作,但是它在JBoss代码中过期了。您不确定(“client”不是很确定),但似乎您在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可以连接,使用OCI和thin, 使用OCI连接,但可以连接 对CompA和CompB都使用thin, 问题。

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

    在里面 Oracle提供的驱动程序;因为在CompB上运行时,相同的代码对CompA和CompB有效,所以它必须是CompC问题,而不是代码中的问题。

    所以

    1. 化学机械抛光(1) 反对司机 确认他们是一样的。
    2. 当他们不在的时候,rcp司机 从CompB到CompC再到test。
    3. 找出出了什么问题 配置控制。
        2
  •  2
  •   nooci nooci    15 年前

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