在之前的讨论中提出 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 中,如果多个 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/