2

カスタムの「接続」クラスを使用してJCAアダプタを構築しています。私が見たすべての例では、接続クラスに「void close()」を配置することになっています。次に、カスタム接続クラスを使用しているときに、finallyブロックにclose()を呼び出す必要があります。

私は、開発者がfinallyブロックに近づくことを覚えているとは本当に信じていません。また、EntityManagerで「close()」を呼び出す必要はありません。コンテナは、EntityManagerの開閉を自動的に管理します。

コンテナにJCAアダプタへの接続を自動的に閉じる方法はありますか?finalize()をオーバーライドしようとしましたが、JVMが接続のクリーンアップを決定するまでに非常に長い時間がかかる可能性があります。

または、finallyブロックでclose()なしでカスタム接続クラスが使用されたすべての場所でfindbugsのプラグインを作成してIDを取得する方法を誰かが知っていれば、おそらくそれで大丈夫でしょう。

4

1 に答える 1

1

ワークフローを知っている場合は、接続のアクティビティを監視するバックグラウンドスレッドを作成し、一定の時間(10秒、30秒、2時間など)後にすべてを閉じることができます。

前述のように、finalizeメソッドをオーバーライドすることもできます。使用可能ですが、保証はされません。ただし、適度にビジーなサーバーでは、ほとんどの接続を時間内に閉じるのに十分なGCアクティビティを取得している可能性があります。ファイナライズの保証がない場合の注意点は、誰かがプロセスを強制終了した場合(またはプロセスが失敗した場合など)、ファイナライズが呼び出されないことを受け入れることです。

最後に、新しい例外を作成し、そのスタックトレースに入力するだけで、接続が作成される簡単なキャプチャです。開いている接続でその例外を保持し、(時間、ファイナライズなどによって)閉じるように「強制」されていることを検出したら、例外をログにダンプして、問題のある「開いている」行を見つけることができます。接続。

コネクタが破壊されたとき、またはアンデプロイされたとき(つまり、モジュールがサーバーから削除されたとき、またはサーバーがシャットダウンしたとき)は、JCAライフサイクルに接続する必要があります。これにより、モジュールが削除されたときに開いたままになっている接続がわかります。

于 2012-01-04T01:17:23.777 に答える