Что вы делаете при повторном развертывании приложения? Выключение виртуальной машины или просто повторное развертывание без перезапуска 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 , который также делает это.