2012-05-08 2 views
2

Я хотел бы получить доступ к одному и тому же файлу db из разных программ параллельно. Все программы работают на одной виртуальной машине. Вот код, который я использую:DB4o database 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. Как использовать этот db параллельно?

ответ

3

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

В тот же экземпляр виртуальной машины Java вы можете открыть новый session containers like это:

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

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

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

Смежные вопросы