我們有一個REST層和後端作爲Jackrabbit實現。我們使用了默認設置的TransientRepository。 當兩個請求(僅用於讀取節點)被同時觸發時,我們正面臨以下錯誤:Jackrabbit存儲庫鎖定併發訪問
:RepositoryLock.acquire(134)::已檢測到鎖定文件{tomcat}/.lock。存儲庫沒有正確關閉。 javax.jcr.RepositoryException:由於名爲.lock的文件已被當前進程鎖定,因此存儲庫主目錄{tomcat}似乎處於使用狀態。
jackrabbit wiki頁面:http://wiki.apache.org/jackrabbit/RepositoryLock提到,當存儲庫已經在同一進程中打開但在另一個類加載器(例如,在另一個web應用程序中)時會發生這種情況。在這種情況下,您需要確保在Web應用程序停止時存儲庫已關閉。
我們用下面的代碼用於獲取庫和創建會話:
try {
Repository repository = new TransientRepository(REPO_CONFIG_FILE, REPO_HOME_DIR);
session = repository.login(new SimpleCredentials(REPOSITORY_USERNAME, REPOSITORY_PASSWORD.toCharArray()));
} finally {
if(session != null){
session.logout();
}
}
上面的代碼是每個兔崽子的操作,所以會被每一個操作後關閉。並且只有一個訪問該Jackrabbit存儲庫的Web應用程序。
在RepositoryLock頁面上給出的解決方案建議使用Repository Server。這是唯一的解決方案,或者我在配置或編碼時丟失了一些東西?
感謝您回答這個問題。我嘗試使用TransientRepository.loggedOut(sessionImpl)方法並通過同時點擊兩個請求來測試它,但它仍然會給出RepositoryLock異常。我將評估有一個存儲庫服務器的另一種選擇,但併發線程方案似乎很常見,因爲我想知道是否有任何我缺少的配置。 – averagejoe