簡體   English   中英

使用嵌入在 Neo4j 和 Java 中的不同數據庫

[英]Use different databases embedded in Neo4j with Java

我正在嘗試評估 Neo4j 中的不同數據模型。出於這個原因,我創建了兩個具有這些不同模型的數據庫並將它們保存在同一目錄中:

path/to/database/graphModel1
path/to/database/graphModel2

下一步是我用 java 創建了一個應用程序,我可以在其中 select 我要評估的數據模型和查詢(只有幾個預定義的查詢)。 根據選擇的 model 我想使用嵌入式數據庫的實例。 目前,我使用以下 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);

但是在使用 model1 執行第一個查詢並想使用 model2 計算相同的查詢后,使用該代碼片段我得到了以下異常:

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 ,但這對啟動第二個嵌入式數據庫有何影響? 有誰知道如何解決這個問題?

提前致謝!

您的 GraphDatabase 實例可能未正確關閉 - 將其留在鎖定的 state 中。我在上面的代碼中看到您正在注冊關閉掛鈎,但對於graphDB而不是graph 這或許可以解釋實例未正確關閉的原因。

如果您知道沒有其他實例指向您的 Neo4j 目錄,您可以嘗試手動刪除graph.db/lockgraph.db/store_lock文件並再次運行代碼。

(嵌入式)數據庫存儲位置的目錄結構存在長期的常見誤解。 設計者在 API 中提交“根”DB 文件夾,同時要求提交子存儲庫文件夾。

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,“嵌入式”設置進行驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM