在Java程序中,我有一个包含数据库连接的单例类,整个程序使用该连接。
如何在程序结束时告诉Java关闭连接?
我可以在main的末尾放置一个connection.close()语句,但如果程序意外结束,例如未捕获的异常或"退出"则不会执行此操作。在程序中的某个地方打电话。无论程序如何结束,我如何告诉Java关闭连接?
答案 0 :(得分:2)
如果可能调用方法System.exit
,则可以使用a VM shutdown hook。
Runtime.getRuntime().addShutdownHook(new Thread(() -> closeDatabaseConnection()));
如果程序正常退出,也会调用关闭挂钩:
Java虚拟机关闭以响应两种事件:
- 当最后一个非守护程序线程退出或调用
System.exit
方法时,程序正常退出,或者- 虚拟机将终止以响应用户中断,例如键入
^C
或系统范围的事件,例如用户注销或系统关闭。
但是如果出现意外情况,我们无法保证会运行:
在极少数情况下,虚拟机可能会中止,即停止运行而不会干净地关闭。当虚拟机在外部终止时会发生这种情况,例如Unix上的
SIGKILL
信号或Microsoft Windows上的TerminateProcess
调用。如果本机方法因例如破坏内部数据结构或尝试访问不存在的内存而出错,则虚拟机也可能中止。 如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。