2009-02-26 89 views
3

假設我有一個打開數據庫連接的Java應用程序。通常情況下,我會在finally塊中添加一個connection.close(),但在kill操作或任何其他異常終止的情況下,該塊不會執行嗎?作爲程序員,是否還有其他預防措施可以在應用程序退出之前正確關閉連接?處理異常Java程序出口

回答

2

殺死一個程序最終會從您的程序到您的[Oracle|SQL Server|MySQL|PostgreSQL]服務器超時一個TCP流。

服務器將看到它並回滾所有待處理的事務。

3

如果外部的東西殺死了你的程序,那麼你無能爲力。顯然他們想要阻止它,那麼你如何防止它們呢?

我要建議一個shutdown hook,但的Javadoc狀態:

在極少數情況下,虛擬機可以中止,就是停止不乾淨關停運行。當虛擬機在外部終止時會發生這種情況,例如Unix上的SIGKILL信號或Microsoft Windows上的TerminateProcess call。如果本機方法出錯,例如破壞內部數據結構或嘗試訪問不存在的內存,則虛擬機也可能中止。 如果虛擬機中止,則不能保證是否將運行任何關閉掛鉤。

(重點煤礦)

2
  1. 你不應該需要調用應用程序停機connection.close()時,因爲所有打開的文件會被操作系統自動關閉。
  2. 此外,Connection的finalize()方法應該在應用程序自動關閉之前運行(如果關閉是正常的,不是ABORT的),並且應該關閉連接。
  3. 無論如何,你可以註冊shutdown-hooks,做你需要的任何清理(再次,將運行在正常關閉的情況下,而不是ABORTs)。
+0

finalize通常不會在正常的應用程序關閉時運行。 (和Windows 95(!)在異常退出後不會關閉你的套接字!) – 2009-02-26 15:17:32

1

某些程度的異常終止是不可避免的。你將如何捕捉電源線被拉到服務器上的事件?