次のように3台のマシンをセットアップしています。
- CompA: Oracle サーバー 10.2.0.3 の実行
- CompB: Oracle サーバー 10.2.0.4 とクライアント コードの実行
- CompC: クライアント コードのみを実行する
CompB と CompC の両方のクライアント コードで、どちらの Oracle DB への接続も Thin ドライバーを使用して問題なく動作します。
クライアントコードからOCIドライバーを介して各Oracle DBに接続しようとしています
Connection conn = DriverManager.getConnection('jdbc:oracle:oci:username/pass@sid');
jboss で実行されている Java クラスの内部から。これは CompB では問題なく動作しますが、CompC では毎回 Jboss を実行している JVM がコア ダンプします。
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 です。これら 3 つのライブラリと jboss サーバー自体はソース管理されているため、CompB と CompC の両方で同じバージョンです。
CompB は、OCI とシンを使用して、CompA と CompB の両方に接続できます。CompC は OCI を使用して接続できませんが、シンを使用して CompA と CompB の両方に接続できるため、サーバーのバージョンの問題ではありません。
CompB と CompC はどちらも 32 ビットの Ubuntu 8.04 を実行していますが、CompB の 3.25GB RAM と比較して、CompC の CPU はわずかに遅く、RAM は 1GB しかありません。