web-dev-qa-db-ja.com

SQLRecoverableException:I / O例外:接続リセット

昨日の夕方、私は実行中のJavaプログラムを実行しました。JDBC接続を使用して会社のデータベース(Oracle)に多くのレコードを挿入する必要があります。私はこのエラーを見ました(try-catchによってキャッチされました):

Java.sql.SQLRecoverableException: I/O Exception: Connection reset

プログラムはこの問題を取得する前にほぼすべてのレコードを作成しましたが、それが早期に発生した場合(夕方にオフィスを出てから数分後)はどうでしょうか?何が起こったのか理解できず、データベース管理者に連絡しましたが、彼はデータベースに特別な問題はないと述べました。

何が起こったのか、それを回避するために私は何ができますか?

15
Maik

これは単に、バックエンド(DBMS)の何かがリソースの利用不能などのために動作を停止することを決定したことを意味します。これはコードまたは挿入の数とは関係ありません。同様の問題の詳細については、こちらをご覧ください。

これはあなたの質問に答えないかもしれませんが、なぜそれが起こっているのかを知ることができます。 DBAとさらに話し合って、特定の問題があるかどうかを確認できます。

13
kensen john

このエラーは、一部のRedHatディストリビューションで発生します。必要なことは、パラメータJava.security.egd = file:/// dev/urandomを指定してアプリケーションを実行することだけです。

Java -Djava.security.egd=file:///dev/urandom [your command]
23
Nacho Soriano

nacho-soriano の解決策の補完的な答えを作りたい...

私は最近、Java書かれたアプリケーション(実際にはTalend ELTジョブ)がOracleデータベース(11g以上)に接続してランダムに失敗するという問題を解決するために検索しました。OSはRedHat Enterpriseです。 CentOS:ジョブは非常に時間内に(30分以内に)実行され、頻繁に発生します(5分ごとに約1回実行)。

夜間に作業時間として、データベース集中作業使用時に遅延作業使用時に、Wordだけでランダムに接続が失敗し、次のメッセージが表示されます。

Exception in component tOracleConnection_1
Java.sql.SQLRecoverableException: Io exception: Connection reset
        at Oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.Java:101)
        at Oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.Java:112)
        at Oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.Java:173)
        at Oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.Java:229)
        at Oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.Java:458)
        at Oracle.jdbc.driver.T4CConnection.logon(T4CConnection.Java:411)
        at Oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.Java:490)
        at Oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.Java:202)
        at Oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.Java:33)
        at Oracle.jdbc.driver.OracleDriver.connect(OracleDriver.Java:465)
        at Java.sql.DriverManager.getConnection(DriverManager.Java:664)
        at Java.sql.DriverManager.getConnection(DriverManager.Java:208)
    and StackTrace follow ...

問題の説明:

詳細 ここ

Oracle接続には、適切なレベルのセキュリティを想定するために、いくつかの乱数が必要です。 Linux乱数ジェネレーターは、キーボードとマウスのアクティビティに基づいていくつかの数値を生成し(特に)、スタックに配置します。サーバー上では、そのようなアクティビティはそれほど多くありません。そのため、ソフトウェアはジェネレーターが生成できるよりも多くの乱数を使用することがあります。

プールが空の場合、/ dev/randomからの読み取りは、追加の環境ノイズが収集されるまでブロックされます。また、Oracle接続はタイムアウトになります(デフォルトでは60秒)。

ソリューション1-1つのアプリソリューションに固有

解決策は、開始時にJVMに指定された2つのパラメーターを追加することです。

-Djava.security.egd=file:/dev/./urandom
-Dsecurerandom.source=file:/dev/./urandom

注: '/./'は重要です。ドロップしないでください!

したがって、起動コマンドラインは次のようになります。

Java -Djava.security.egd=file:/dev/./urandom -Dsecurerandom.source=file:/dev/./urandom -cp <classpath directives> appMainClass <app options and parameters>

このソリューションの欠点の1つは、ランダム性が影響を受けるため、生成される数値がやや安全性が低いことです。あなたが軍事または秘密関連の業界で働いていない場合、このソリューションはあなたになり得ます。

解決策2-一般Java JVMソリューション

説明通り こちら

ソリューション1で指定された両方のディレクティブは、Javaセキュリティ設定ファイルに入れることができます。

を見てみましょう $Java_HOME/jre/lib/security/Java.security

行を変更する

securerandom.source=file:/dev/random

securerandom.source=file:/dev/urandom

変更は、新しい実行中のアプリケーションに対してすぐに有効になります。

ソリューション#1に関して、このソリューションの1つの欠点は、生成される数値がやや安全性が低いことですランダム性が影響を受けます。今回は、グローバルなJVMの影響です。解決策#1に関しては、軍事または秘密関連の業界で働いていない場合、この解決策はあなたになります。

理想的には、Java 5の後に以前のパスが/ dev/randomを指すため、「file:/ dev /./ urandom」を使用する必要があります。

報告されたバグ: https://bugs.openjdk.Java.net/browse/JDK-6202721

解決策3-ハードウェアソリューション

Disclamer:ハードウェアベンダーまたは製品のいずれにもリンクしていません...

高品質の乱数レベルに到達する必要がある場合は、Linux乱数ジェネレーターソフトウェアをハードウェアに置き換えることができます。

いくつかの情報が利用可能です こちら

よろしく

トーマス

11
tdaget

ソリューション
アプリケーションのセットアップを変更して、このパラメーター[-Djava.security.egd = file:/ dev /../ dev/urandom] Javaコマンドの横:

Java-Djava.security.egd = file:/ dev /../ dev/urandom[コマンド]

参照:- https://community.Oracle.com/thread/943911

5
user3886907

11gから12cにアップグレードした後、これらのエラーが断続的に発生し、Javaは1.6でした。

私たちの修正は、Javaとjdbcを6から7にアップグレードすることでした

export Java_HOME='/usr/Java1.7'

export CLASSPATH=/u01/app/Oracle/product/12.1.0/dbhome_1/jdbc/libojdbc7.jar:$CLASSPATH 

数日後、まだ断続的な接続のリセット。

上記のJava 7をすべて削除することになりました。 Java 6は大丈夫でした。この問題は、ユーザーbash_profileに追加することで修正されました。

エラーが発生したgroovyスクリプトは、バッチVMサーバーで/ dev/randomを使用していました。以下ではJavaとgroovyに/ dev/urandomを使用するように強制しました。

export Java_OPTS = "$ Java_OPTS -Djava.security.egd = file:/// dev/urandom"

4
Liz

あなたの例外はそれをすべて「接続リセット」と言います。 Javaプロセスとdbサーバーの間の接続が失われました。これは、ほとんどすべての理由(ネットワークの問題など)で発生した可能性があります。) SQLRecoverableException 、しかし根本的な原因は接続のリセットです。

2
Suraj Chandran