用于并发访问的Jackrabbit存储库锁定

时间:2013-11-22 13:25:50

标签: java jackrabbit jcr

我们有一个REST层和后端作为Jackrabbit实现。我们使用TransientRepository和默认设置。 当两个请求(仅用于读取节点)同时被触发时,我们面临以下错误:

:RepositoryLock.acquire(134)::检测到现有锁定文件{tomcat} / .lock。存储库未正确关闭。 javax.jcr.RepositoryException:存储库home {tomcat}似乎正在使用中,因为名为.lock的文件已被当前进程锁定。

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应用程序可以访问Jackrabbit存储库。

RepositoryLock页面上给出的解决方案建议使用Repository Server。这是唯一的解决方案,还是我在配置或编码时遗漏了什么?

1 个答案:

答案 0 :(得分:1)

也许你应该使用方法

  

loggedOut(SessionImpl session)             从打开的会话集中删除给定的会话。   具体到这个存储库   或者在应用程序监听器中使用Repository Server并通过JNDI访问它,以便您可以干净地启动/停止它?