2010-08-29 128 views
0

我刚刚开始使用java/wicket/db4o编写我的第一个webapp,并且所有技术都是我的新技术,所以请原谅可能是一个愚蠢的问题。如何在应用程序关闭/重新启动时关闭db4o连接?

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

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

在此先感谢。 Tom

回答

1

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

如果您没有重新启动网络服务器,您可能会遇到单例仍然存在的问题并保持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这也是。

+0

这看起来非常有用 - 非常感谢! – Tom 2010-08-30 22:38:32

+0

我相信这会变得有用,但是我发现了一个导致问题的代码中的错误。我为我的测试使用了相同的db4o文件,与我的应用程序的运行版本相同。所以,在部署之后,当我运行我的测试时,他们失败了,因为我的应用程序仍在运行,并且db4o文件被锁定了! – Tom 2010-08-30 23:34:39

相关问题