【问题标题】:How to close a db4o connection when application is shutdown/restarted?应用程序关闭/重新启动时如何关闭 db4o 连接?
【发布时间】:2010-08-29 23:41:40
【问题描述】:

我刚刚开始使用 java/wicket/db4o 编写我的第一个 web 应用程序,所有技术对我来说都是新的,所以请原谅可能是一个愚蠢的问题。

我创建了一个简单的 MyDao 单例类,它连接到基于文件的 db4o 数据库,我可以将一些对象写入其中并读回它们。我遇到的问题是每次从 Netbeans 重新部署我的应用程序时,我都会在测试期间收到 com.db4o.ext.DatabaseFileLockedException 异常。如果我删除数据库,这种情况就会消失。

我认为一旦我的 MyDao 对象超出范围,我需要关闭() db4o 连接,但我不知道该怎么做。如果我使用 Perl,我的 MyDao 类中有一个 DESTROY() 方法,该方法在我的 db4o db 上调用 close()。我不确定java中的等效机制是什么。 我曾尝试在 MyDao 对象上使用 finalize() 方法,但这并没有奏效。

提前致谢。 汤姆

【问题讨论】:

    标签: java db4o


    【解决方案1】:

    重新部署应用程序时会做什么?关闭虚拟机还是直接重新部署而不重新启动 JVM 和 Web 容器?

    如果您不重新启动网络服务器,您可能会遇到单例仍然存在并保持 db4o 数据库运行的问题。在旧实例运行时,您无法使用另一个 db4o 实例打开数据库文件。否则会损坏数据库。这意味着您需要在“关闭”数据库应用程序时关闭 db4o 实例。

    我不太了解 Wicket。可能它提供了一种在您“关闭”应用程序时采取行动的方法。否则,您始终可以使用原始的 Java-Web-Facilities。当您启动、停止或重新部署应用程序时,会调用一个 ServletContextListener 接口:

    例如:

    public class DatabaseSingleton implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            // initialize the database.
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            // close database
            System.out.println("close");
        }
    
    }
    

    然后在web.xml中注册它:

        <listener>
        <listener-class>info.gamlor.DatabaseSingleton</listener-class>
    </listener>
    

    也许还可以看看db4o servlet-example,它也可以做到这一点。

    【讨论】:

    • 我相信这会很有用,但是我在我的代码中发现了一个导致问题的错误。我为我的测试使用了与我的应用程序的运行版本相同的 db4o 文件。因此,在部署之后,当我运行测试时它们失败了,因为我的应用程序仍在运行并且 db4o 文件被锁定!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    相关资源
    最近更新 更多