Как закрыть соединение db4o, когда приложение закрыто / перезапущено? - PullRequest
0 голосов
/ 30 августа 2010

Я только начал писать свое первое веб-приложение, используя java / wicket / db4o, и все технологии для меня новы, поэтому, пожалуйста, простите, что может быть глупым вопросом.

Я создал простой одноэлементный класс MyDao, который подключается к файловой базе данных db4o, и я могу записать в нее некоторые объекты и прочитать их обратно. Проблема, с которой я сталкиваюсь, заключается в том, что при каждом повторном развертывании моего приложения из Netbeans во время тестов я получаю исключение com.db4o.ext.DatabaseFileLockedException. Это исчезнет, ​​если я удалю БД.

Я думаю, что мне нужно закрыть () соединение db4o, как только мой объект MyDao выйдет из области видимости, но я не знаю, как это сделать. Если бы я использовал Perl, у меня был бы метод DESTROY () в моем классе MyDao, который вызывает close () в моей базе данных db4o. Я не уверен, что эквивалентный механизм в Java. Я пытался использовать метод finalize () для моего объекта MyDao, но это не сработало.

Спасибо заранее. Том

1 Ответ

1 голос
/ 30 августа 2010

Что вы делаете при повторном развертывании приложения? Выключение виртуальной машины или просто повторное развертывание без перезапуска JVM и веб-контейнера?

Если вы не перезапустите веб-сервер, возможно, проблема в том, что синглтон все еще существует и поддерживает работу базы данных db4o. Пока работает старый экземпляр, вы не можете открыть файл базы данных с другим экземпляром db4o. В противном случае это повредит базу данных. Это означает, что вам нужно завершить работу экземпляра db4o, когда вы закроете приложение базы данных.

Я не очень хорошо знаю Wicket. Вероятно, он предоставляет метод для принятия мер, когда вы закрываете приложение. В противном случае вы всегда можете использовать необработанные Java-Web-средства. Существует 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 , который также делает это.

...