假设我有一个打开数据库连接的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