DB4o база данных DatabaseFileLockedException

Я хотел бы получить доступ к одному и тому же файлу БД из разных программ параллельно. Все программы работают на одной и той же виртуальной машине. Вот код, который я использую:

private ObjectContainer db;

public DatabaseManager(String dbName) {
    ObjectServer server = Db4oClientServer.openServer(Db4oClientServer
            .newServerConfiguration(), dbName, 0);
    try {
         db = server.openClient();

        // Do something with this client, or open more clients

    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

Когда я запускаю вторую программу, я получаю исключение DatabaseFileLockedException. Как использовать эту БД параллельно?

1 ответ

Решение

Только один экземпляр db4o может одновременно получить доступ к файлу базы данных. Если вы попытаетесь открыть его, когда контейнер объекта открыт, вы получите это DatabaseFileLockedException.

В том же экземпляре JVM вы можете открывать новые контейнеры сеансов, например:

 ObjectContainer rootContainer = // the one you've opened the file with
 ObjectContainer session = rootContainer.ext().openSession()

С вашим кодом вы также можете использовать метод.openClient(), чтобы сделать то же самое. Однако вам на самом деле не нужны клиент-серверные компоненты, если вы находитесь в одном экземпляре JVM. Вы можете использовать все вышеперечисленное с обычным встроенным контейнером объектов.

В случае, если вам нужен доступ к одной и той же базе данных из нескольких баз данных, вам понадобится полная настройка клиент-сервер.

Другие вопросы по тегам