7

現在、OracleでJavaストアドプロシージャを使用していますが、Javaコード内で接続を取得しようとすると奇妙な動作が見られます。

私のJavaはjarファイルにパッケージ化されてから、loadjavaコマンドラインユーティリティを使用してOracleにデプロイされます。次に、データベースにApackageが作成され、指定されたJavaクラスの各メソッドが呼び出し仕様を介してPL/SQL関数にマップされます。

私が扱っている列のいくつかはCLOBsです。CLOBJavaでは、これの値(呼び出し仕様にとしてマップされているoracle.sql.CLOB)をString:に抽出しようとします。

private static String getStringFromCLOB(CLOB clob) throws SQLException {
    long length = clob.length();
    return clob.getSubString(1, (int) length);
}

このコードを実行すると、SQL*Plusに次のスタックトレースが表示されます。

java.lang.ArithmeticException: / by zero
    at oracle.jdbc.driver.T2SConnection.<init>(T2SConnection.java:107)
    at oracle.jdbc.driver.T2SDriverExtension.getConnection(T2SDriverExtension.java:31)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:481)
    at oracle.jdbc.driver.OracleDriver.defaultConnection(OracleDriver.java:505)
    at oracle.sql.DatumWithConnection.getPhysicalConnection(DatumWithConnection.java:53)
    at oracle.sql.DatumWithConnection.getInternalConnection(DatumWithConnection.java:177)
    at oracle.sql.CLOB.getDBAccess(CLOB.java:1383)
    at oracle.sql.CLOB.length(CLOB.java:197)

のメッセージが表示される前にException、問題のあるメソッドの内容をでラップしてtry / catch、完全なスタックトレースをにダンプできるようにしましたSystem.out

これはOracle11.2.0.1.0(32ビット)では機能していましたが、Oracle 11.2.0.2.0(64ビット)では機能していません

他のJavaベースのPL/SQLfunctionも問題なく動作しました。失敗するのは接続を確立しようとするものだけです。

私が調べた<ORACLE_HOME>\jdbc\libところ、jarは同じ名前ですが、これら2つのディストリビューションでは異なっているようです。ディレクトリ内のjarファイルは次のとおりです(11.2.0.1.0サイズと11.2.0.2.0サイズが表示されています)。

  • ojdbc5.jar(1,950KB | 1,983KB)
  • ojdbc5_g.jar(3,010KB | 3,271KB)
  • ojdbc5dms.jar(2,374KB | 2,489KB)
  • ojdbc5dms_g.jar(3,030KB | 3,291KB)
  • ojdbc6.jar(2,062KB | 2,102KB)
  • ojdbc6_g.jar(3,323KB | 3,782KB)
  • ojdbc6dms.jar(2,594KB | 2,698KB)
  • ojdbc6dms_g.jar(3,344KB | 3,805KB)
  • simplefan.jar(20KB | 20KB)<-おそらく同じ

これらのjarのマニフェストファイルは、特定のバージョン、つまり11.2.0.1.0または11.2.0.2.0用にビルドされていることを確認します。11.2.0.2.0でバグが発生した可能性はありますか?または、ユーザー、つまり私のエラーである可能性が高いですか:-)

また、oracle.jdbc.driver.T2SConnectionクラスはどこに住んでいますか?

どんな助け/ガイダンスも大歓迎です。さらに詳しい情報が必要な場合はお知らせください。

4

4 に答える 4

5

パスワードの有効期限が切れたときにこの問題が発生しました。パスワードを変更するだけでこれを解決しました。

于 2016-06-27T13:44:26.320 に答える
2

最近の Oracle JDBC ドライバーにも同様の問題があります。私たちのケースは、11.2.0.1 と 11.2.0.3 のような異なるバージョンの jar を混在させる問題のようです。たとえば、11.2.0.1 の ojdbc6.jar と 11.2.0.3 の oi18n.jar です。Oracle JDBC ドライバーの jar ファイル全体を逆コンパイルし、エラーが発生しているソース コード内の行を調べるという優れた手法があります。エラー/バグに関するヒントを提供できます。

両方のクライアント マシンで同じ JDBC ドライバー バージョンを使用してみてください。

oracle.jdbc.driver.T2CConnectionojdbc5.jar など、ドライバーの任意のメイン jar に存在します。

于 2012-06-11T17:54:45.657 に答える
0

この問題に遭遇する可能性のある方のために、Oracle 内の JVM インストールの破損が原因であることがわかりました。これは、不適切なインストールが原因で発生した可能性があります。

Oracle の JVM の側面を再インストールするoracle.jdbc.driver.OracleConnection.defaultConnection()と、明示的に呼び出された場合でも、別の呼び出しのスタックの一部として呼び出された場合でも、問題なく実行できましたoracle.sql.CLOB.length()

于 2012-08-31T09:10:36.780 に答える