Используйте разные базы данных, встроенные в Neo4j с Java
Я пытаюсь оценить различные модели данных в Neo4j. По этой причине я создал две базы данных с разными моделями и сохранил их в одном каталоге:
path/to/database/graphModel1
path/to/database/graphModel2
Следующим шагом является то, что я создал приложение с Java, где я могу выбрать модель данных и запрос, который я хочу оценить (есть только несколько предопределенных запросов). В зависимости от того, какая модель была выбрана, я хочу использовать экземпляр встроенной базы данных. На данный момент я использую следующее условие if, чтобы различать их:
if (model.equals("G1")) {
graph = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH_1);
} else if (model.equals("G2")) {
graph = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH_2);
}
registerShutdownHook(graph);
Но используя этот фрагмент кода, я получил следующее исключение после того, как выполнил первый запрос с моделью 1 и хочу вычислить тот же запрос с моделью 2:
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@1f1e9b8' was successfully initialized, but failed to start. Please see attached cause exception.
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:513)
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)
at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:330)
... 69 more
Caused by: org.neo4j.kernel.StoreLockException: Unable to obtain lock on store lock file: path/to/database/graphModel1/store_lock. Please ensure no other process is using this database, and that the directory is writable (required even for read-only access)
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:78)
at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:44)
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:507)
... 71 more
Caused by: java.io.IOException: Couldn't lock lock file path/to/database/graphModel1/lock because another process already holds the lock.
at org.neo4j.io.fs.FileLock.getLockFileBasedFileLock(FileLock.java:126)
at org.neo4j.io.fs.FileLock.getOsSpecificFileLock(FileLock.java:70)
at org.neo4j.io.fs.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:85)
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:74)
... 73 more
Я понял, что уже есть store_lock
и lock
на первой базе данных, но как это влияет на запуск второй встроенной базы данных? кто-нибудь знает, как решить эту проблему?
Заранее спасибо!
2 ответа
Вполне возможно, что ваш экземпляр GraphDatabase не был должным образом закрыт - оставив его в заблокированном состоянии. Я вижу в вашем коде выше, что вы регистрируете ловушку отключения, но для graphDB
не graph
, Это может объяснить, как экземпляр не был правильно закрыт.
Если вы знаете, что нет других экземпляров, указывающих на каталог Neo4j, вы можете попробовать вручную удалить graph.db/lock
а также graph.db/store_lock
файлы и запуск вашего кода снова.
В структуре каталогов для (встроенного) хранилища базы данных существует давнее распространенное недопонимание. Дизайнеры отправляют «корневую» папку БД в API, в то время как требуется отправить папку дочернего репозитория.
new GraphDatabaseFactory().newEmbeddedDatabase( "path/to/db" ) // wrong
new GraphDatabaseFactory().newEmbeddedDatabase( "path/to/db/repository" ) // correct
В описанном случае рассмотрите возможность расширения путей к созданным/повторно используемым местоположениям базы данных с помощью папки «репозиторий» (это имя может быть изменено):
path/to/database/graphModel1/repository
path/to/database/graphModel2/repository
Когда оба экземпляра БД запустятся одновременно, вы увидите следующие созданные элементы файловой системы:
path/to/database/graphModel1/repository
path/to/database/graphModel1/logs
path/to/database/graphModel1/store_lock
path/to/database/graphModel2/repository
path/to/database/graphModel2/logs
path/to/database/graphModel2/store_lock
Как видим, никаких конфликтов «store_lock» здесь нет. Проверено с Neo4j версии 3.5.17, "встроенная" установка.