2009-02-26 8 views
3

データベース接続を開くJavaアプリケーションがあるとします。通常はfinallyブロックにconnection.close()を追加しますが、このブロックはkill操作やその他の異常終了の場合には実行されません。プログラマとして、アプリケーションが終了する前に接続を適切に閉じるために行うことができる他の予防措置はありますか?異常なJavaプログラムの終了の処理

答えて

3

Java(http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread))のRuntime.addShutdownHook()メソッドを見てください。仮想マシンの終了時に呼び出されるフックを追加することができます。これを使用してクリーンアップルーチンを呼び出すことができます。

これはTERMシグナルのためです。 KILLシグナルはプロセスを終了させ、(KILLシグナルは受信プロセスによって捕捉されたり無視されたりすることができないため、クリーンアップを行わないようにします。

+0

KILL信号を克服する方法.... –

2

プログラムを強制終了すると、最終的にプログラムから[Oracle|SQL Server|MySQL|PostgreSQL]サーバーにストリームTCPがタイムアウトします。

サーバーはそれを見て、保留中のトランザクションをロールバックします。

3

外部から何かプログラムが削除された場合、何もできません。明らかに彼らはそれを止めたかったので、どのようにそれらを防ぐことができますか?

私はshutdown hookを提案しようとしてますが、Javadocの状態ました:

まれな状況では、仮想マシンがつまり、きれいにシャットダウンせずに実行を停止し、を中止することがあります。これは、仮想マシンが外部で終了した場合に発生します。たとえば、UnixではSIGKILLシグナル、Microsoft WindowsではTerminateProcess callシグナルです。たとえば、内部データ構造が壊れたり、存在しないメモリにアクセスしようとしたりするなどして、ネイティブメソッドが失敗した場合、仮想マシンは中止されることもあります。 仮想マシンが異常終了した場合、シャットダウンフックが実行されるかどうかは保証されません。

(強調鉱山)開いているすべてのファイルがオペレーティングシステムによって自動的に閉じられますので、あなたは、アプリケーションのシャットダウンにconnection.close()を呼び出す必要はありません

2
  1. また、Connectionのfinalize()メソッドは、自動的に(シャットダウンが正常でABORTされていない場合)アプリケーションをシャットダウンする前に実行し、接続を終了する必要があります。
  2. いずれの場合も、shutdown-hooksを登録して、必要なクリーンアップを実行できます(ABORTではなく、通常のシャットダウン時に実行されます)。
+0

通常、通常のアプリケーションシャットダウンではファイナライズされません。 (そしてWindows 95(!)異常終了後にあなたのソケットを閉じないでください!) –

1

ある程度の異常終了は避けられません。電源ケーブルがサーバーに引っ張られているという事態をどうやって捕まえることができますか?

関連する問題