データベース接続を開くJavaアプリケーションがあるとします。通常はfinallyブロックにconnection.close()を追加しますが、このブロックはkill操作やその他の異常終了の場合には実行されません。プログラマとして、アプリケーションが終了する前に接続を適切に閉じるために行うことができる他の予防措置はありますか?異常なJavaプログラムの終了の処理
答えて
Java(http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread))のRuntime.addShutdownHook()メソッドを見てください。仮想マシンの終了時に呼び出されるフックを追加することができます。これを使用してクリーンアップルーチンを呼び出すことができます。
これはTERMシグナルのためです。 KILLシグナルはプロセスを終了させ、(KILLシグナルは受信プロセスによって捕捉されたり無視されたりすることができないため、クリーンアップを行わないようにします。
実際にあなたが殺されると(UNIXではkill -9
)、それに対して何もすることはできません。
finally
-blockが最も可能です。詳しくは、SO: In Java, is the “finally” block guaranteed to be called (in the main method)?を参照してください。
プログラムを強制終了すると、最終的にプログラムから[Oracle|SQL Server|MySQL|PostgreSQL]
サーバーにストリームTCP
がタイムアウトします。
サーバーはそれを見て、保留中のトランザクションをロールバックします。
外部から何かプログラムが削除された場合、何もできません。明らかに彼らはそれを止めたかったので、どのようにそれらを防ぐことができますか?
私はshutdown hookを提案しようとしてますが、Javadocの状態ました:
まれな状況では、仮想マシンがつまり、きれいにシャットダウンせずに実行を停止し、を中止することがあります。これは、仮想マシンが外部で終了した場合に発生します。たとえば、Unixでは
SIGKILL
シグナル、Microsoft WindowsではTerminateProcess call
シグナルです。たとえば、内部データ構造が壊れたり、存在しないメモリにアクセスしようとしたりするなどして、ネイティブメソッドが失敗した場合、仮想マシンは中止されることもあります。 仮想マシンが異常終了した場合、シャットダウンフックが実行されるかどうかは保証されません。
(強調鉱山)開いているすべてのファイルがオペレーティングシステムによって自動的に閉じられますので、あなたは、アプリケーションのシャットダウンにconnection.close()を呼び出す必要はありません
- 。
- また、Connectionのfinalize()メソッドは、自動的に(シャットダウンが正常でABORTされていない場合)アプリケーションをシャットダウンする前に実行し、接続を終了する必要があります。
- いずれの場合も、shutdown-hooksを登録して、必要なクリーンアップを実行できます(ABORTではなく、通常のシャットダウン時に実行されます)。
通常、通常のアプリケーションシャットダウンではファイナライズされません。 (そしてWindows 95(!)異常終了後にあなたのソケットを閉じないでください!) –
ある程度の異常終了は避けられません。電源ケーブルがサーバーに引っ張られているという事態をどうやって捕まえることができますか?
- 1. Javaでのウィンドウの処理と終了
- 2. Windowsアプリケーションの処理終了処理
- 3. supervisorctl ERROR(異常終了)
- 4. apachebenchが異常なエラーメッセージで異常終了する
- 5. Javaスレッドはメッセージnullの例外で異常終了します。
- 6. Turbo C++ Webブラウザでプログラムが異常終了する
- 7. Excel.Rangeオブジェクトは処理しないExcel処理を終了する
- 8. Javaプログラムがクローズボタンで終了しない
- 9. 終了していないJavaプログラム2
- 10. Java、例外の処理と終了、tryとfinallyのストリーム
- 11. 終了コード(PM_ASSERT_ERROR)でプロセスタスクが異常終了しました
- 12. 異常な例外処理ダミー命令
- 13. Perl:HTML :: PrettyPrinter - 自己終了タグの処理
- 14. ビルドフロープラグインとの並列処理が終了しない理由
- 15. プログラムでJavaのプロセスを終了する
- 16. Javaを使用したプログラムの終了
- 17. Javaで終了するアプリケーションイベントを処理する方法は?
- 18. WPF終了イベントを処理する
- 19. フラスコ終了応答と処理続行
- 20. Java - 正常にスレッドを終了する
- 21. Office ComアドインでプログラムでPowerPointの終了イベントを処理する方法
- 22. java終了プログラムについて
- 23. Javaプロセスの正常なシャットダウン/終了を行うには?
- 24. Executorサービスと非常に高速なJavaコードの終了?
- 25. プログラムの終了時にプロセスが終了しない
- 26. 処理コマンドgitがゼロ以外の終了値で終了しました128
- 27. 応答のないプログラムで、終了を要求されたとき正常に終了しません。
- 28. Phoenixログの異常なエラー:MyApp.Endpointの実行が終了しました
- 29. C#プログラムが終了した後にコンソールが終了しない
- 30. ICS最近のアプリリストの「スワイプから終了」機能の処理
KILL信号を克服する方法.... –