假設我有一個打開數據庫連接的Java應用程序。通常情況下,我會在finally塊中添加一個connection.close(),但在kill操作或任何其他異常終止的情況下,該塊不會執行嗎?作爲程序員,是否還有其他預防措施可以在應用程序退出之前正確關閉連接?處理異常Java程序出口
回答
您應該查看Java的Runtime.addShutdownHook()方法(http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread))。它允許你添加一個虛擬機終止時將被調用的鉤子。您可以使用它來調用清理例程。
雖然這將是一個TERM信號。 KILL信號會終止進程並且不允許進行清理(因爲接收進程無法捕獲或忽略KILL信號)。
當你真的死亡(UNIX上的kill -9
),你不能做任何事情。
A 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,做你需要的任何清理(再次,將運行在正常關閉的情況下,而不是ABORTs)。
finalize通常不會在正常的應用程序關閉時運行。 (和Windows 95(!)在異常退出後不會關閉你的套接字!) – 2009-02-26 15:17:32
某些程度的異常終止是不可避免的。你將如何捕捉電源線被拉到服務器上的事件?
- 1. Java:異常處理程序
- 2. Java:全局異常處理程序
- 3. Java全局異常處理程序
- 4. Java swing異常處理程序
- 5. 在全局異常處理程序中處理線程異常?
- 6. 異常處理程序
- 7. Java中的異常處理和接口
- 8. Java異常處理?
- 9. Java異常處理
- 10. Java異常處理
- 11. Java異常處理
- 12. java異常處理
- 13. Java異常處理
- 14. Java異常處理
- 15. 處理Java異常
- 16. 處理java異常
- 17. Java異常處理
- 18. 出口導致未處理的異常
- 19. Java程序在執行批處理時拋出異常
- 20. Java寫出程序未處理的異常類型IOException
- 21. php:在異常處理程序中處理異常?
- 22. Java的異常處理NullPointerException異常
- 23. django異常處理程序中間件和處理程序500
- 24. 程序流程處理時異常PLSQL
- 25. Java如何編程:異常處理
- 26. 錯誤處理程序中拋出的PHP異常不會被異常處理程序捕獲
- 27. 異常處理:什麼異常提出
- 28. 從PL/SQL函數調用Java程序並處理Java異常
- 29. Infinity的Java異常處理
- 30. 核心-java異常處理
如何克服KILL信號.... – 2016-08-13 12:11:19