Oracle Autonomous Database(ATPおよびADW)のJDBCトラブルシューティングのヒント

1. JDBC Thinドライバの例外

  • 問題1:IOエラー:接続識別子「jdbctest_high」を解決できませんでした 

    原因:接続文字列で使用されるTNS別名は、tnsnames.oraファイルに定義されています。このファイルのパスは、TNS_ADMINプロパティで指定します。アプリケーションがこのファイルの保存場所にアクセスできない場合や、tnsnames.oraにTNS別名が定義されていない場合、この例外が発生します。 

    解決策:TNS_ADMINでtnsnames.oraファイルの保存場所を指定します。JDBC Thinドライバ18.3以降では、接続URLの一部として(jdbc:oracle:thin:@dbname_medium?TNS_ADMIN=/users/test/wallet_dbname/) を指定するか、システム・プロパティ(-Doracle.net.tns_admin)または接続プロパティ(OracleConnection.CONNECTION_PROPERTY_TNS_ADMIN)として設定できます。TNS_ADMINが正しく設定されていることを確認してください。

  • 問題2:キー・ストアを初期化できない、またはjava.io.IOException:キー・ストアが改ざんされたか、パスワードが正しくありません

    原因:ウォレットのパスワードが接続プロパティjavax.net.ssl.trustStorePasswordまたは javax.net.ssl.keyStorePasswordで正しく渡されているか確認してください。パスワードの末尾に余分なスペースがないか確認してください。パスワードの末尾にスペースが含まれていると、このエラーが発生することがあります。

    解決策:ウォレットのパスワードを指定した行の末尾に余分なスペースがないか、またパスワード自体が正しいかを確認してください。 

  • 問題3:java.security.KeyStoreException:SSOが見つかりません

    原因:追加のJARファイルoraclepki.jar、osdt_core.jar、osdt_cert.jarがクラスパスに含まれており、アクセス可能であることを確認してください。これらのJARファイルがクラスパスに含まれていない場合、このエラーが発生することがあります。

    解決策:18.3のoraclepki.jar、osdt_core.jar、osdt_cert.jarをダウンロードし、クラスパスに配置してください

  • 問題4:致命的なアラートを受信:handshake_failure

    原因:Oracle Cloudでは、自律型データベースへの接続にTLSv1.2の使用が必須です。そのため、この例外は(a)古いJDBCドライバ、(b)クラスパス内の複数バージョンのJDBCドライバ、(c)JDKのバージョンなどが原因で発生する可能性があります。 

    解決策:前提条件のセクションを確認し、適切なバージョンのJDBCドライバとJDKを使用しているか確認してください。また、クラスパスに含まれているJDBCドライバが1つだけであることも確認してください。  

2. 古いJDK、JDBC Thinドライバ、またはJDBC-OCIドライバで発生する例外 

  • 問題1:致命的なアラートを受信:handshake_failure

    原因:Oracle Cloudでは、JDK 9の最新バージョン、またはJDK 8u71以降が必要です。JDK 7を使用する場合は、少なくともJDK 7u80以降が必要です。上記の例外は、古いバージョンのJDK 8またはJDK 7を使用していることが原因で発生している可能性があります。 問題2も確認してください。

    解決策:JDK 8をJDK 8u71以降に、またはJDK 7をJDK 7u80以降にアップグレードしてください。

  • 問題2:致命的なアラートを受信:handshake_failure

    原因:JDK 7を使用する場合は、追加の接続プロパティ -Doracle.net.ssl_cipher_suites を(TLS_RSA_WITH_AES_256_CBC_SHA256)に設定する必要があります。JDK 7で暗号スイートを明示的に設定しないと、例外が発生します。

    解決策:JDK 7では、追加の接続プロパティまたはシステム・プロパティとして-Doracle.net.ssl_cipher_suites=(TLS_RSA_WITH_AES_256_CBC_SHA256)を設定してください。

  • 問題3:ネットワーク・アダプタが接続を確立できませんでした

    原因:Oracle Cloudでは、強度の高い暗号スイートが必要です。JDK 9またはJDK 8u162を使用している場合は、問題ありません。それ以外の場合、強度の高い暗号スイートTLS_RSA_WITH_AES_256_CBC_SHA256を有効にするため、JDK 8とJDK 7のどちらの環境でも、JCEポリシー・ファイルをインストールする必要があります。推奨されるJCEポリシー・ファイルである local_policy.jarおよびUS_export_policy.jarがない場合は、例外が発生します。

    解決策: JCE Unlimited Strength Jurisdiction Policy Filesをダウンロードしてください。インストールに関する注意事項については、READMEを参照してください。

  • 問題4:ハンドシェイク中にリモート・ホストによって接続が切断されました

    原因:Oracle Cloudでは、転送プロトコルとしてTLSv1.2を使用する必要があります。 JDBC Thinドライバ12.1.0.2を使用する場合は、クラウド向けJDBCドライバのダウンロードから入手できるパッチ適用済みのJARファイルを使用するか、バグ23176395のパッチを適用する必要があります。このバグのパッチによってTLSv1.2を使用できるようになりますが、自動的に有効になるわけではありません。そのため、TLSのバージョンを明示的に設定する必要があります。

    解決策:プロパティoracle.net.ssl_version=1.2を設定してください。このプロパティは、-Dを使用したシステム・プロパティとして、または接続レベルのプロパティとして設定できます。

  • JDBC-OCI – 問題5:libocijdbcのバージョンに互換性がありません[Jdbc:121020, Jdbc-OCI:121010

    原因:クラスパスに含まれるJDBCドライバのバージョンが、ダウンロードしたOracle Instant ClientのディレクトリにあるJDBCドライバのバージョンと異なっている可能性があります。

    解決策:Instant Clientと同じバージョンのJDBCドライバを使用してください。Instant Client 12_1を使用する場合は、JDBCドライバ12.1.0.2を使用してください。

  • JDBC-OCI – 問題6:ORA-28759:ファイルを開けませんでした

    原因:このエラーには、次の2つの原因が考えられます。

    (a) sqlnet.ora とtnsnames.oraが同じディレクトリに存在しない場合、または

    (b) sqlnet.oraに cwallet.sso の保存場所を示すパスが反映されていない場合です。

    解決策:sqlnet.ora とtnsnames.oraを同じディレクトリに配置し、ウォレット・ファイル( cwallet.sso)の保存場所を示すパスをsqlnet.oraに設定してください。 

3. デバッグのヒント

  • Autonomous Transaction Processing(ATP)やAutonomous Data Warehouse(ADW)などのOracle Autonomous Databaseへの接続時にJDBC関連の問題が発生した場合は、システム・プロパティ -Djavax.net.debug=all を使用してデバッグを有効にしてください。