Jackrabbit存储库锁定以实现并发访问



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

:RepositoryLock.acquise(134)::检测到现有锁文件{tomcat}/.lock。存储库未正确关闭。javax.jcr.RepositoryException:存储库主页{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。这是这里唯一的解决方案吗?还是我在配置或编码时遗漏了一些东西?

也许你应该使用方法

loggedOut(SessionImpl会话)从打开的会话集中删除给定的会话。哪个是这个位置特有的或者在应用程序侦听器中使用Repository Server,并通过JNDI对其进行访问,以便可以干净地启动/停止它?

最新更新