5

以前は機能していたJPAプロジェクトがあります。今月、データベースにいくつかのデータを追加しました。通常のジョブを実行すると (前の月に実行していました)、次のエラーが発生します。

例外 [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007)): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Network error IOException : アドレスは既に使用されています: 接続エラー コード: 0

カウンターを出力して、呼び出しているほとんどのメソッドを含む LocalPersistenceFacade をチェックしたところ、そこで閉じられた接続と開いた接続の正確な数が得られました: 457 です。その後、ジョブがクラッシュしました。通常、457 ではなく 601 まで行く必要があります。

データベース側では、クラッシュの可能性に関する情報はありません。すべてが正しいように見えますが、私の Java コードは別のことを言っています。

誰かアイデアがありましたか?

よろしく、ジャン

4

1 に答える 1

6

私の理解では、各行の接続を開いたり閉じたりしていて、直面している問題はこのページで説明されているようなものです。

考えられる原因

複数の機能を持つマップで大量のデータを実行する場合。Windows は、ネットワーク I/O 例外の原因となる十分な速さで接続を閉じません。

推奨事項

Windows レジストリで次の 2 つの値を変更します。

これは、Windows が接続を開くために使用するポートの範囲を変更します。デフォルトでは、ポート 5000 までしか許可されません。この値を変更することにより、Windows は最初に戻る前に、より多くのポートを開くことができます。すべての接続はポートを使用するため、1025 から始まり、この値まで上がります。最大値に達すると、1025 に戻り、そのポートを再度開こうとします。

システム キー:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
名前: MaxUserPort タイプ: REG_DWORD
値: 5000-65534

これにより、閉じたポートがより速く「解放」されます。デフォルトでは、Windows はポートを 240 秒間 TIME_WAIT 状態のままにします。MaxPort 値が、新しい接続が TIME_WAIT 状態からまだ削除されていない「古い」ポートを使用する場所に設定されている場合、これにより問題が発生する可能性があります。この値を小さくすると、接続をより速く解放できます。

システム キー:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
値の名前: TcpTimedWaitDelay データ
型: REG_DWORD 値のデータ: 30-300

導入された症状と変更 (より多くの行) は完全に一致します。ただし、提案された「推奨」で問題が解決する場合がありますが、私の推奨は接続プールを使用することです ( c3p0DBCPなどのスタンドアロン接続プールを使用します)。これにより、IMO は問題を解決しパフォーマンスを向上させることができます。

于 2010-04-12T20:05:05.633 に答える