2012-01-03 10 views
0

カスタム '接続'クラスを使用してJCAアダプタを構築しています。私が見たすべての例では、接続クラスに「void close()」を置くことになっています。その後、カスタム接続クラスを使用している間は、finallyブロックにclose()を呼び出す必要があります。接続が自動的に閉じるJCAアダプタを構築することは可能ですか?

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

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

また、findbugs用のプラグインをどこにでも作成する方法を知っていれば、finally接続でclose()を使わずにカスタム接続クラスが使用されていました。

答えて

1

あなたのワークフローを知っているなら、あなたの接続で活動を見ているバックグラウンドスレッドを持ち、一定時間(10秒、30秒、2時間など)の後に何かを閉じることができます。

前述のとおり、finalizeメソッドをオーバーライドすることもできます。それは使用可能で、保証されていません。しかし、合理的に忙しいサーバーでは、時間内にほとんどの接続を閉じるのに十分なGCアクティビティを得ている可能性があります。ファイナンスを保証しないという警告は、誰かがプロセスを殺す(またはそれが間違っているなど)場合、ファイナライズが呼び出されないことを単に受け入れることです。

最後に、単純に新しい例外を作成してスタックトレースを埋め込むだけで簡単に接続を作成できます。その例外を開いた接続のままにしておき、時間切れ、ファイナライズなどの処理を「強制」していることが検出されたら、その例外をログにダンプして、接続。

コネクタが破棄されたり、展開されなかった場合(つまり、モジュールがサーバーから取り外されたとき、またはサーバーがシャットダウンしたとき)には、JCAライフサイクルを実行する必要があります。これにより、モジュールが取り外されていた接続が開いたままになっていることがわかります。

+0

ですから、短い答えは「本当に」ではありません:) –

関連する問題