3

次のように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 しかありません。

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 があることがわかっています。したがって、私の最初の疑いは、2 つのマシンに互換性のないバージョンの libocijdbc10.so があることです。CompA と CompB で異なるバージョンの Oracle を使用しているようです。私は、CompA のオラクルと通信する CompB のコードは失敗し、CompB と通信する CompC のコードは実行されると予測しています。

CompB と CompC で Oracle OCI ドライバ ソフトウェアのバージョンを確認します。

アップデート

さて、あなたは言います:

CompB は、OCI とシンを使用して、CompA と CompB の両方に接続できます。CompC は OCI を使用して接続できませんが、シンを使用して CompA と CompB の両方に接続できるため、サーバーのバージョンの問題ではありません。

それで、あなたはこれを絞り込みました。3 つの接続方法 (Thin、SQL*Plus、および OCI) と 3 つのサーバーのうち、唯一失敗したのは CompC からの OCI の使用です。CompA と CompB の両方との通信に失敗します。

問題は、CompC JBoss の構成の問題です。オラクルが提供するドライバーではまだ失敗しています。CompB で実行する場合、同じコードが CompA と CompB に対して機能するため、コードの問題ではなく、CompC の問題である必要があります。

そう

  1. CompB と CompC のドライバ ライブラリに対してcmp(1)を実行し、それらが同じであることを確認します。
  2. そうでない場合は、ドライバーを CompB から CompC に rcp してテストします。
  3. 構成制御の何が問題だったのかを突き止めます。
于 2009-03-25T03:00:14.153 に答える
2

ネイティブの OCI ドライバーをあきらめるだけです。これは終わりのない頭痛の種です。

純粋な Java ドライバーを使用してください。安定性が高く、高速で、メモリの使用量が少なくなります。

于 2009-03-25T21:49:34.750 に答える