处理异常Java程序出口

处理异常Java程序出口,java,database,termination,Java,Database,Termination,假设我有一个打开数据库连接的Java应用程序。通常我会在finally块中添加connection.close(),但在kill操作或任何其他异常终止的情况下不会执行此块,是吗?作为一名程序员,我是否可以采取任何其他预防措施,以便在应用程序退出之前正确关闭连接?当您真的被杀死时(kill-9在UNIX上),您不能对此采取任何措施 finally-块是您所能做的最多的操作,有关详细信息,请参见。杀死一个程序将最终使从您的程序到您的[Oracle | SQL Server | MySQL | Pos

假设我有一个打开数据库连接的Java应用程序。通常我会在finally块中添加connection.close(),但在kill操作或任何其他异常终止的情况下不会执行此块,是吗?作为一名程序员,我是否可以采取任何其他预防措施,以便在应用程序退出之前正确关闭连接?

当您真的被杀死时(
kill-9
在UNIX上),您不能对此采取任何措施


finally
-块是您所能做的最多的操作,有关详细信息,请参见。

杀死一个程序将最终使从您的程序到您的
[Oracle | SQL Server | MySQL | PostgreSQL]
服务器的
流超时


服务器将看到它并回滚任何挂起的事务。

您应该查看Runtime.addShutdownHook()方法for Java()。它允许您添加一个钩子,当虚拟机终止时将调用该钩子。您可以使用它来调用清理例程


不过,这是一个术语信号。KILL信号将终止进程,并且不允许它进行任何清理(因为接收进程无法捕获或忽略KILL信号)。

如果外部有什么东西终止了您的程序,您将无能为力。很明显他们想阻止它,那么你怎么能阻止他们呢

我本想提出一个建议,但Javadocs声明:

在极少数情况下,虚拟机可能会中止,即在未完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在Unix上使用
SIGKILL
信号或在Microsoft Windows上使用
TerminateProcess调用
。如果本机方法出错(例如,损坏内部数据结构或试图访问不存在的内存),虚拟机也可能会中止如果虚拟机中止,则无法保证是否会运行任何关机挂钩。

(强调矿山)

  • 您不需要在应用程序关闭时调用connection.close(),因为操作系统会自动关闭所有打开的文件
  • 此外,连接的finalize()方法应该在应用程序自动关闭之前运行(如果关闭是正常的,而不是中止),这应该关闭连接
  • 在任何情况下,您都可以注册,以执行所需的任何清理(同样,将在正常关机情况下运行,而不是中止)

  • 某种程度的异常终止是不可避免的。您将如何捕获服务器上的电源线被拉的事件

    finalize通常不会在正常应用程序关闭时运行。(和Windows 95(!)在异常退出后不会关闭您的插槽!)