【问题标题】:H2 embedded mode and software crashesH2 嵌入式模式和软件崩溃
【发布时间】:2013-11-20 02:57:29
【问题描述】:

众所周知,H2 是一个功能强大的纯 Java DBMS,具有服务器/客户端模式和嵌入式等多种功能
在使用 H2 数据库开发一个小软件时,我遇到了一个问题:
软件崩溃并且连接保持打开状态,重新启动软件时我无法再次访问数据库(它处于嵌入式模式,因此它被锁定)并且为了绕过这个问题,我不得不使用任务管理器手动关闭 Java 虚拟机
有没有办法以防发生此类事件(应用程序崩溃)但我可以正常恢复连接?

【问题讨论】:

    标签: java crash h2 embedded-database


    【解决方案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 以正常方式关闭 ;)
    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多