将blob从数据库迁移到jackrabbit中的文件系统

时间:2012-05-09 15:21:55

标签: java jackrabbit jcr jsr170

正如前一次讨论中提出的那样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数据库和文件系统。

一些意见:

我发现至少有几种方法可以帮助完成迁移工作:

1 个答案:

答案 0 :(得分:4)

可能存在存储库损坏。也就是说,节点包含给定名称(要添加的节点)的子节点条目,但子节点本身不存在。特别是在较旧版本的Jackrabbit中,如果多个会话同时尝试更改相同的节点,则可能会遇到这种情况。

要解决此类损坏问题,bundle db persistence managers支持一致性检查&修复功能。您需要在repository.xml和workspace.xml文件中设置这些选项,然后重新启动Jackrabbit。修复后,您可以再次禁用这些选项。

还有一种方法可以在运行时修复此类问题,方法是将系统属性org.apache.jackrabbit.autoFixCorruptions设置为true,然后遍历存储库中的所有节点。