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 嵌入式模式和软件崩溃的主要内容,如果未能解决你的问题,请参考以下文章

H2 功能特点

H2 功能特点

在生产模式下访问 Play 框架的嵌入式 H2 数据库

如何使用 Gluon 在 Android 平台上将 H2 数据库连接为嵌入式模式?

配置嵌入式 H2 用户以进行分发

带有 h2 嵌入式数据库的 MySQL LONGTEXT