2013-11-22 77 views
5

我們有一個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。這是唯一的解決方案,或者我在配置或編碼時丟失了一些東西?

回答

1

也許你應該使用的方法

loggedOut(SessionImpl會話) ,將從打開的會話中刪除指定的會議。 這是特定於此存儲庫 或在應用程序偵聽器中使用存儲庫服務器,並讓它可以通過JNDI訪問,以便您可以乾淨地啓動/停止它?

+0

感謝您回答這個問題。我嘗試使用TransientRepository.loggedOut(sessionImpl)方法並通過同時點擊兩個請求來測試它,但它仍然會給出RepositoryLock異常。我將評估有一個存儲庫服務器的另一種選擇,但併發線程方案似乎很常見,因爲我想知道是否有任何我缺少的配置。 – averagejoe