3

正如前面讨论中提出的使用文件系统而不是数据库来存储 pdf 文件在 jackrabbit 中, 我们可以使用FileDataStore将 blob 文件存储在文件系统而不是数据库中(我的情况是存储了大约 100 kb 大小的 pdf)。

我遇到的以下问题是处理以前存储在 blobstore 中的文件,我希望它们在切换到FileDataStore.

在使用方法时添加FileDataStore对 repository.xml 的支持后,我得到:JcrUtilsgetOrAddNodeItemExistsException

public static Node getOrAddNode(Node parent, String name)
        throws RepositoryException {
    if (parent.hasNode(name)) {
        return parent.getNode(name);
    } else {
        return parent.addNode(name);
    }
}

例如parent.hasNode(name),返回 false(似乎该项目不存在),但随后我们陷入代码parent.addNode(name),从而引发 ItemExistsException。

有什么帮助吗?

是否有必要将 blob 迁移到FileDataStore或者存在某种配置,jackrabbit 可以同时在不同位置搜索 blob:在我的情况下是 mysql 数据库和文件系统。

一些评论:

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

4

1 回答 1

4

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

为了修复此类损坏问题,捆绑数据库持久性管理器支持一致性检查和修复功能。您需要在 repository.xml 和 workspace.xml 文件中设置这些选项,然后重新启动 Jackrabbit。修复后,您可以再次禁用这些选项。

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

于 2012-05-09T15:34:07.320 回答