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

标签 java db4o

我刚刚开始使用 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/

相关文章:

java - 如何用 2 个分数格式化 BigDecimal?

java - 一个字符串中有多个方法?

java - Db4o API 在 NetBeans 中看不到动态加载的类?

asp.net-mvc - 鉴于以下要求,我想推出自己的身份验证/授权系统是不是错了?

java - db4o 如何实例化对象?

java - 如何禁用 Java 安全管理器?

java - 从 `file.encoding` 设置 `pom.xml`

java - Line2D 和 JComponent 交点和仿射变换

java - 为什么在 Java 中无法对已删除类型进行拆箱?

android - 计时器异常 - java.lang.RuntimeException : Can't create handler inside thread that has not called Looper. prepare() - Android