我刚刚开始使用java / wicket / db4o编写我的第一个webapp,所有技术对我来说都是新的,所以请原谅可能是一个愚蠢的问题。
我创建了一个简单的MyDao单例类,它连接到基于文件的db4o数据库,我可以将一些对象写入其中并将其读回。我遇到的问题是每次从Netbeans重新部署我的应用程序时,我在测试期间收到com.db4o.ext.DatabaseFileLockedException异常。如果删除数据库,这就消失了。
我认为我的MyDao对象超出范围后我需要关闭()db4o连接,但我不知道如何做到这一点。如果我使用的是Perl,我的MyDao类中会有一个DESTROY()方法,它调用db4o db上的close()。我不确定java中的等效机制是什么。 我试图在我的MyDao对象上使用finalize()方法,但这没有用。
提前致谢。 汤姆
答案 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也是如此。