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