在Java程序中,我有一个单例类来保存数据库连接,该连接由整个程序使用。
如何告诉Java在程序结束时关闭连接?
我可以在 main 末尾放置一个 connection.close() 语句,但是如果程序意外结束,例如,由于程序中某处未捕获的异常或“退出”调用,则不会执行该语句。无论程序如何结束,如何告诉 Java 关闭连接?
你可以使用虚拟机关闭挂钩 https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)如果该方法System.exit
可能会被称为。
Runtime.getRuntime().addShutdownHook(new Thread(() -> closeDatabaseConnection()));
如果程序正常退出,关闭钩子也会被调用:
Java 虚拟机关闭以响应两种事件:
- 当最后一个非守护线程退出或当
System.exit
方法被调用,或者
- 虚拟机响应用户中断而终止,例如键入
^C
,或系统范围的事件,例如用户注销或系统关闭。
但如果发生意外情况,并不能保证它们会运行:
在极少数情况下,虚拟机可能会中止,即停止运行而不完全关闭。当虚拟机从外部终止时会发生这种情况,例如使用SIGKILL
Unix 上的信号或TerminateProcess
在 Microsoft Windows 上调用。如果本机方法出现错误,例如损坏内部数据结构或尝试访问不存在的内存,则虚拟机也可能中止。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)