2009-02-26 91 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

某些程度的异常终止是不可避免的。你将如何捕捉电源线被拉到服务器上的事件?