昨日の夕方、私は実行中のJavaプログラムを実行しました。JDBC接続を使用して会社のデータベース(Oracle)に多くのレコードを挿入する必要があります。私はこのエラーを見ました(try-catchによってキャッチされました):
Java.sql.SQLRecoverableException: I/O Exception: Connection reset
プログラムはこの問題を取得する前にほぼすべてのレコードを作成しましたが、それが早期に発生した場合(夕方にオフィスを出てから数分後)はどうでしょうか?何が起こったのか理解できず、データベース管理者に連絡しましたが、彼はデータベースに特別な問題はないと述べました。
何が起こったのか、それを回避するために私は何ができますか?
これは単に、バックエンド(DBMS)の何かがリソースの利用不能などのために動作を停止することを決定したことを意味します。これはコードまたは挿入の数とは関係ありません。同様の問題の詳細については、こちらをご覧ください。
これはあなたの質問に答えないかもしれませんが、なぜそれが起こっているのかを知ることができます。 DBAとさらに話し合って、特定の問題があるかどうかを確認できます。
このエラーは、一部のRedHatディストリビューションで発生します。必要なことは、パラメータJava.security.egd = file:/// dev/urandomを指定してアプリケーションを実行することだけです。
Java -Djava.security.egd=file:///dev/urandom [your command]
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秒)。
解決策は、開始時に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つは、ランダム性が影響を受けるため、生成される数値がやや安全性が低いことです。あなたが軍事または秘密関連の業界で働いていない場合、このソリューションはあなたになり得ます。
説明通り こちら
ソリューション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
Disclamer:ハードウェアベンダーまたは製品のいずれにもリンクしていません...
高品質の乱数レベルに到達する必要がある場合は、Linux乱数ジェネレーターソフトウェアをハードウェアに置き換えることができます。
いくつかの情報が利用可能です こちら 。
よろしく
トーマス
ソリューション
アプリケーションのセットアップを変更して、このパラメーター[-Djava.security.egd = file:/ dev /../ dev/urandom] Javaコマンドの横:
Java-Djava.security.egd = file:/ dev /../ dev/urandom[コマンド]
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"
あなたの例外はそれをすべて「接続リセット」と言います。 Javaプロセスとdbサーバーの間の接続が失われました。これは、ほとんどすべての理由(ネットワークの問題など)で発生した可能性があります。) SQLRecoverableException 、しかし根本的な原因は接続のリセットです。