我刚刚开始使用 java/wicket/db4o 编写我的第一个 Web 应用程序,所有技术对我来说都是新的,所以请原谅可能是一个愚蠢的问题。
我创建了一个简单的 MyDao 单例类,它连接到基于文件的 db4o 数据库,我可以向其中写入一些对象并读回它们。我遇到的问题是每次从 Netbeans 重新部署应用程序时,我都会在测试期间收到 com.db4o.ext.DatabaseFileLockedException 异常。如果我删除数据库,这个问题就会消失。
我认为一旦 MyDao 对象超出范围,我需要 close() db4o 连接,但我不知道如何执行此操作。如果我使用 Perl,我的 MyDao 类中会有一个 DESTROY() 方法,它调用 db4o 数据库上的 close() 方法。我不确定java中的等效机制是什么。 我尝试在 MyDao 对象上使用 Finalize() 方法,但这没有起作用。
提前致谢。 汤姆
最佳答案
重新部署应用程序时会做什么?关闭虚拟机或只是重新部署而不重新启动 JVM 和 Web 容器?
如果您不重新启动网络服务器,您可能会遇到单例仍然存在并保持 db4o 数据库运行的问题。当旧实例运行时,您无法使用另一个 db4o 实例打开数据库文件。否则会损坏数据库。这意味着您需要在“关闭”数据库应用程序时关闭 db4o 实例。
我不太了解 Wicket。也许它提供了一种在您“关闭”应用程序时采取操作的方法。否则,您始终可以使用原始 Java-Web-Facility。当您启动、停止或重新部署应用程序时,会调用一个 ServletContextListener 接口(interface):
例如:
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这也可以做到这一点。
关于java - 应用程序关闭/重新启动时如何关闭 db4o 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3597057/