应用程序关闭/重新启动时如何关闭db4o连接?

时间:2010-08-29 23:41:40

标签: java db4o

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

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

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

提前致谢。 汤姆

1 个答案:

答案 0 :(得分:1)

重新部署应用程序时,您会怎么做?关闭虚拟机或只是重新部署而不重新启动JVM和Webcontainer?

如果不重新启动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也是如此。