数据库
首页 > 数据库> > java-将Blob从数据库迁移到jackrabbit中的文件系统

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

作者:互联网

正如前面的讨论中所建议的那样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数据库和文件系统.

一些评论:

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

>规格http://wiki.apache.org/jackrabbit/BackupAndMigration
讲述了如何使用JCR API(Session.exportSystemView(..),然后是Session.importXML(..)),以及RepositoryCopier API等.
> jackrabbit-jcr-import-export-tool(请参阅http://svn.apache.org/repos/asf/jackrabbit/sandbox/jackrabbit-jcr-import-export-tool/README.txt)
>使用Jackrabbit独立服务器(http://jackrabbit.apache.org/standalone-server.html)

解决方法:

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

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

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

标签:jcr,jackrabbit,jsr170,java
来源: https://codeday.me/bug/20191101/1982969.html