2016-12-17 78 views
0

我们在生产中使用JackRabbit。不幸的是,我们必须在仓库一些不一致的地方,这使得无法读取这些数据:如何解决Jackrabbit JCR(BundleFsPersistenceManager)中的不一致问题

ERROR ResourceServiceImpl - RepositoryException to JCR javax.jcr.PathNotFoundException: 1661b5c

Spring bean配置是这样的:

<bean id="repository" class="org.apache.jackrabbit.core.RepositoryImpl" destroy-method="shutdown"> 
    <constructor-arg index="0" ref="config" /> 
    </bean> 
    <bean id="config" class="org.apache.jackrabbit.core.config.RepositoryConfig" factory-method="create"> 
    <constructor-arg index="0" ref="jcrXml"/> 
    <constructor-arg index="1" value="${instance.repository}" /> 
    </bean> 

    <bean id="jcrXml" class="com.example.misc.InputStreamBeanFactory" factory-method="createStream"> 
    <constructor-arg value="/jackrabbit-repository.xml" /> 
    </bean> 
    <bean name="jcrSession" factory-bean="repository" factory-method="login" scope="session" destroy-method="logout" /> 

workspaces.xml看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?><Workspace name="default"> 
    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> 
     <param name="path" value="${wsp.home}"/> 
    </FileSystem> 
    <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager"/> 
</Workspace> 

从我学到的(太晚)here,上面配置的BundleFsPersistenceManager可能会变得不一致。这也写在这里应该被用于生产。那么,它现在正在生产,以前没有人注意到这一点,我们想交换这一点。但首先我们必须迁移数据,因此我们需要修复它。

我的问题:有没有办法解决这个问题还是这些数据丢失的好?

我的第二个问题:我们可以做些什么来避免将来出现这些问题?

回答

0

有关于Adobe CQ - Repository Inconsistency(使用Jackrabbit)的持久性管理器上可设置的附加check..参数的说明。 Magnolia - JCR Troubles有一个用于搜索和删除损坏节点的脚本示例。我已经看到了一种将此脚本的逻辑(用java编写)组合起来的方法,并且检查参数允许一个存储库重新启动并运行足够长的时间以便将内容取出。

为了避免将来出现的问题 - 你想要一个独立的设置,不使用RDBMS - 我建议org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager

<PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager"> 
     <param name="url" value="jdbc:derby:${wsp.home}/db;create=true"/> 
     <param name="schemaObjectPrefix" value="${wsp.name}_"/> 
    </PersistenceManager>