web-dev-qa-db-ja.com

java.sql.SQLException:Io例外:ソケット読み取りがタイムアウトしたvs閉じた接続

OracleDBに接続する次の2つのエラーについてこの問題を調査しようとしています。

  1. 閉じた接続
  2. Java.sql.SQLException:Io例外:ソケット読み取りがタイムアウトしました

私の理解:

  1. 閉じた接続:ある種のネットワークの中断があったか、ある種の「非アクティブ」のためにDBがセッションを閉じたために発生しています
  2. Java.sql.SQLException:Io例外:ソケット読み取りがタイムアウトしました:これは接続が正常に確立されたが、何らかの理由でソケット/データが空であり、データが利用できなかったために最終的にタイムアウトした場合です。

上記のエラーをローカルのOracleDB環境で複製することは可能ですか?手順は何ですか?

お時間を割いていただきありがとうございます。

ありがとう。

7
kart0624

閉じた接続についてのあなたの理解は正しいです。接続が閉じられた理由:ファイアウォール、ネットワークデバイス、リモートデータベースリスナーなどの外部デバイスは、一定期間非アクティブになった後、ネットワーク接続を強制的に閉じることができます

ReadTimeOutは、アクティブな接続でも発生します。クエリまたはプロシージャに時間がかかる場合は、読み取りタイムアウト例外が発生します。

  • 閉じた接続:データベースの実行中にデータベースリスナーをシャットダウンします
  • ReadTimedOut:10分を超えてプロシージャにスリープを追加し、アプリケーションからそのプロシージャを呼び出します

Oracle DB環境でのソケット読み取りタイムアウト・エラーの複製:

  1. setNetworkTimeout for SQL connection //たとえば、タイムアウトを120秒に設定します
  2. Javaからデータベースプロシージャを呼び出し、setNetworkTimeoutよりも長い時間そのプロシージャでスリープします

    dbms_lock.sleep(125); -- sleeps for 125 seconds
    

プロシージャは、125秒のスリープのために120秒以内に戻ってこないため、上記のシナリオではJavaはソケット読み取りタイムアウトをスローします。

2
Ravindra babu

Java.sql。*パッケージを使い始めたばかりですが、これが私が理解していることです。閉じた接続は、発生したエラーであり、DBセッションは閉じますが、エラー処理は行われないため、これで終わりです。 Java.SQExceptionを使用すると、このエラーを管理して(throws句を使用)、印刷したり、他のエラー処理メソッドを実行したりできます。

例外とその処理方法に関するOracleからのリンクは次のとおりです。

お役に立てれば。

Javaの例外

0
troy_frommer