如何修复 Jackrabbit JCR (BundleFsPersistenceManager) 中的不一致
How to fix inconsistency in Jackrabbit JCR (BundleFsPersistenceManager)
我们在生产中使用 JackRabbit。不幸的是,我们在存储库中存在一些不一致,这使得数据不可读:
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 可能会变得不一致。此处还写到,这应该 NOT 用于生产。好吧,它现在正在生产中,之前没有人注意到这一点,我们想交换一下。然而,首先我们必须迁移数据,因此我们需要修复它。
我的问题:有没有办法解决这个问题,或者这些数据是否永远丢失了?
我的第二个问题:我们可以做些什么来避免将来出现这些问题?。
有一些关于可以在 Adobe CQ - Repository Inconsistency (uses Jackrabbit). The Magnolia - JCR Troubles 上的持久性管理器上设置的额外 check..
参数的注释有一个用于搜索和删除损坏节点的脚本示例。我见过一种方法,它结合了这个脚本的逻辑(在 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>
我们在生产中使用 JackRabbit。不幸的是,我们在存储库中存在一些不一致,这使得数据不可读:
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 可能会变得不一致。此处还写到,这应该 NOT 用于生产。好吧,它现在正在生产中,之前没有人注意到这一点,我们想交换一下。然而,首先我们必须迁移数据,因此我们需要修复它。
我的问题:有没有办法解决这个问题,或者这些数据是否永远丢失了?
我的第二个问题:我们可以做些什么来避免将来出现这些问题?。
有一些关于可以在 Adobe CQ - Repository Inconsistency (uses Jackrabbit). The Magnolia - JCR Troubles 上的持久性管理器上设置的额外 check..
参数的注释有一个用于搜索和删除损坏节点的脚本示例。我见过一种方法,它结合了这个脚本的逻辑(在 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>