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

标签 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);
    }
}

例如parent.hasNode(name) 返回 false(似乎该项目不存在) 但随后我们陷入代码 parent.addNode(name) 中,因此抛出 ItemExistsException。

有什么帮助吗?

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

一些评论:

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

最佳答案

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

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

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

关于java - 将 blob 从数据库迁移到 jackrabbit 中的文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10519123/

相关文章:

jackrabbit - 如何在 jackrabbit 2.1 存储库中恢复 "versioned node"?

java - 如何使用java代码发布jcr节点?

java - Selenide:如何从 ElementsCollection 中获取所有 Activity 元素?

java - 很难确定我的设计起点

Java - 如何在同一行上循环和打印来自 2 个 HashMap 的值?

java - 设置存储位置 JackRabbit

java - JCR (JackRabbit) 查询返回空结果

java - 如何将 MOXy JAXB 指定为 Apache CXF 2.2.6 的 Apache CXF 实现

java - 如何从客户端的 webdav 存储库获取文件修订列表

aem - 如何设置资源属性