正如前一次讨论中提出的那样Using file system instead of database to store pdf files in jackrabbit
我们可以使用FileDataStore
将blob文件存储在文件系统而不是数据库中(我的情况是存储了~100 kb大小的pdf)。
我遇到的以下问题是处理以前存储在blobstore中的文件,我希望在切换到FileDataStore
后可以访问这些文件。
将FileDataStore
支持添加到repository.xml之后
使用JcrUtils
方法getOrAddNode
时,我会获得ItemExistsException
:
public static Node getOrAddNode(Node parent, String name)
throws RepositoryException {
if (parent.hasNode(name)) {
return parent.getNode(name);
} else {
return parent.addNode(name);
}
}
e.g。 parent.hasNode(name)
返回false(似乎项目不存在)
但随后我们陷入代码parent.addNode(name)
,因此抛出了ItemExistsException。
任何帮助?
是否有必要继续将blob迁移到FileDataStore
,或者有一种配置,jackrabbit可以同时搜索不同位置的blob:在我的情况下,mysql数据库和文件系统。
一些意见:
我发现至少有几种方法可以帮助完成迁移工作:
Session.exportSystemView(..)
然后Session.importXML(..)
),使用RepositoryCopier
API等。答案 0 :(得分:4)
可能存在存储库损坏。也就是说,节点包含给定名称(要添加的节点)的子节点条目,但子节点本身不存在。特别是在较旧版本的Jackrabbit中,如果多个会话同时尝试更改相同的节点,则可能会遇到这种情况。
要解决此类损坏问题,bundle db persistence managers支持一致性检查&修复功能。您需要在repository.xml和workspace.xml文件中设置这些选项,然后重新启动Jackrabbit。修复后,您可以再次禁用这些选项。
还有一种方法可以在运行时修复此类问题,方法是将系统属性org.apache.jackrabbit.autoFixCorruptions
设置为true
,然后遍历存储库中的所有节点。