データベース接続を開く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. SOC1 Cobolプログラムで異常終了する
- 2. Javaでのウィンドウの処理と終了
- 3. のIntelliJは、異常なビルドプロセスの終了
- 4. ソフトウェアキーボードの異常終了
- 5. Windowsアプリケーションの処理終了処理
- 6. Linux - プロセス処理の終了
- 7. supervisorctl ERROR(異常終了)
- 8. apachebenchが異常なエラーメッセージで異常終了する
- 9. Appcelerator:[ERROR]アプリケーションインストーラの異常終了。プロセスの終了値は1
- 10. 例外処理後にプログラムが終了するのを防ぐ
- 11. 例外処理メソッド終了なしで終了する
- 12. Javaスレッドはメッセージnullの例外で異常終了します。
- 13. Activiti:チェック処理を終了
- 14. ゴラン取引終了処理
- 15. ベクトルイテレータを使用するとプログラムが異常終了する
- 16. Turbo C++ Webブラウザでプログラムが異常終了する
- 17. ProMotionのライフサイクルメソッドが異常終了する
- 18. IntelliJ IDEA 2016.3.4:ビルドプロセスの異常終了
- 19. Java、例外の処理と終了、tryとfinallyのストリーム
- 20. Javaプログラムがクローズボタンで終了しない
- 21. 終了していないJavaプログラム2
- 22. 私のプログラムの終了の理由
- 23. Excel.Rangeオブジェクトは処理しないExcel処理を終了する
- 24. NullReferenceExceptionの処理ビデオの終了イベント
- 25. ffmpegの終了後の処理方法
- 26. 例外処理をトリガーせずにプログラムを終了
- 27. 終了コード(PM_ASSERT_ERROR)でプロセスタスクが異常終了しました
- 28. 異常な例外処理ダミー命令
- 29. Perl:HTML :: PrettyPrinter - 自己終了タグの処理
- 30. textillate.jsのループ終了判定処理
KILL信号を克服する方法.... –