H2 嵌入式模式和软件崩溃
Posted
技术标签:
【中文标题】H2 嵌入式模式和软件崩溃【英文标题】:H2 embedded mode and software crashes 【发布时间】:2013-11-20 02:57:29 【问题描述】:众所周知,H2 是一个功能强大的纯 Java DBMS,具有服务器/客户端模式和嵌入式等多种功能 在使用 H2 数据库开发一个小软件时,我遇到了一个问题: 软件崩溃并且连接保持打开状态,重新启动软件时我无法再次访问数据库(它处于嵌入式模式,因此它被锁定)并且为了绕过这个问题,我不得不使用任务管理器手动关闭 Java 虚拟机 有没有办法以防发生此类事件(应用程序崩溃)但我可以正常恢复连接?
【问题讨论】:
【参考方案1】:JVM正常存在的情况下,H2一般会自行关闭数据库,如果你自己没有显式做的话。
在最坏的情况下,您也许可以使用Thread#setDefaultUncaughtExceptionHandler
安全地终止 JVM 和/或关闭数据库
【讨论】:
这看起来是一个不错的解决方案,我会试一试。顺便说一句,我知道这是一个非常奇怪的情况,但这种情况(应用程序崩溃数据库未关闭)不止一次发生在我身上 如果 JVM 仍在运行,那么您只是“崩溃”了应用程序,使其不稳定。您可能需要尝试一下才能让它正确,因为我发现有时它并不总是有效 如果它有助于解决您的问题,您可以随时接受答案 - 答案旁边的小“幽灵”勾号 ;)【参考方案2】:我强烈怀疑您的程序存在错误代码,无法在异常时关闭连接。检查所有数据库代码并确保所有连接都已关闭,即使抛出异常也是如此。
一种常见的方法是关闭try-catch-finally的finally
块上的连接。
【讨论】:
你不能只是在代码中去尝试 catch 或 try finally 一切,因为你永远无法保护你的代码崩溃【参考方案3】:@Ossama Nasser:是的,你可以捕获所有东西。你最好这样做,或者提前知道你决定让哪些异常终止你的程序,以及对你的程序资源有什么影响。
Unix-C 程序使用 setjmp() 和 longjmp()。它很原始,但对大多数信号都有效。
但是,JVM 提供了一种替代方法,以替代“在 main() 中的所有内容上尝试/最终”:
Runtime.getRuntime().addShutdownHook(new <whatever you write as a handler class>)
【讨论】:
仅供参考-H2 已经使用ShutdownHook
来管理这种类型的连接。只要 JVM 以正常方式关闭 ;)以上是关于H2 嵌入式模式和软件崩溃的主要内容,如果未能解决你的问题,请参考以下文章