3

在对JCR 或 RDBMS进行了一些研究并阅读了其他帖子之后,我仍然不确定是否将 JCR 而不是 JPA 用于文档管理系统,它必须处理不同的文档类型、非常大的文件以及来自许多人的大量并发访问用户。

我考虑 JCR 的主要原因是因为文档对我来说看起来像是内容,并且规范已经处理了一些随之而来的问题——我主要对存储和版本控制感兴趣。此外,我想将文档内容封装在 JCR 实现中,并将 JPA 用于特定于应用程序的所有其他内容。

也许有人可以帮助我解决剩下的问题:

  • JCR 的读取/查询性能与 JPA 有什么关系(我知道它在实现上应该会有很大差异,但可能有一些经验法则)?
  • 是否有人在具有某些特定 JCR 实现的类似用例中具有实际经验?如果是这样,您是否将它与关系数据库 (JPA) 混合使用?
  • 考虑到文件存储和版本控制的好处,是否值得引入 JCR 的开销?(我可能会使用我自己的自定义使用访问控制 (JPA),并且我不需要额外的灵活性来在运行时引入新的节点属性)
  • 有人对数据完整性和备份解决方案有任何经验吗?

更新:即使已经详细回答了这个问题,但从更实际的角度来看,有人可能会对它的使用有更批判的看法。就个人而言,我越来越关注以下非技术相关的问题:

  1. 文档:Jackrabbit 的文档很差,它的OCM指南在第一段中包含一个死链接,一些示例搜索查询由于未知原因引发异常,一个非常基本的教程中有一个TODO,它的独立服务器在 JDK8 中无法正常工作根本没有记录。
  2. 成熟度: Jackrabbit Oak 似乎仍在进行中,其他解决方案看起来要么被放弃,要么处于前沿。
  3. 社区:与 JPA 相反,做 JCR 的研究会导致点击率降低。当一个刚接触该技术的项目团队陷入(琐碎的)问题时,这可能是一个真正的问题。
4

1 回答 1

5

短版:文档是结构化或半结构化的内容。这就是分层组织的数据存储的用例。如果您不想为自己实现所有基本的 dms/cms 东西,您应该选择 JCR(考虑到这一点,您可能是第一次这样做,而他们一直在这样做)。

长版:JCR 按规范涵盖了文档或内容管理系统的大部分基本用例,例如版本控制、锁定、生命周期管理或引用完整性。此外,它允许您在不更改架构的情况下扩展数据(当然您可以在模型中定义节点类型,但您不必这样做)。大多数 JCR 实现(如 Jackrabbit)在后端使用数据库,使它们比关系后端的抽象层“多一点”。为了处理大数据,您可以在将结构化数据(节点和属性)存储在数据库中的同时使用文件系统存储(这比将每个二进制数据存储到数据库中要快得多)。

当你去 JPA 时,你必须自己处理所有这些 dms/cms 的东西。当然可以,但在 JCR 实现中已经完成了更多的低级编程。每个模型更改都需要架构更改,并且表格布局并不是那么简单(您是否希望为您的文档提供一个大表格,每个属性都是一个列?您是否希望为每个文档类创建一个单独的表格?如何您是否对生命周期进行建模,如何对版本控制进行建模?)

对于 JCR 的第一跳,我推荐David's Model,将应用程序的所有内容都视为内容。我曾在一个项目中工作,我们决定不混合使用 JCR 和 JPA,这样我们就不必处​​理不同的存储 API。

至少有一些 JCR 实现

  • Jackrabbit 2(参考实现,针对读取操作进行了优化,目前处于维护模式)
  • Jackrabbit OAK(针对高度可扩展的内容存储库,具有读/写性能的平衡。它来自与 Jackrabbit 相同的核心团队)
  • Jackrabbit FileVault(后端纯粹在文件系统上)
  • Modeshape(替代实现,快速且可扩展,带有 REST API,相当好的文档)

顺便提一句。JCR API 和实现在很大程度上考虑了 RESTful 架构。因此,如果您考虑 REST API,映射也相当简单。此外,它允许消费者直接通过 JCR API 探索内容,从而可以轻松地将内容集成到其他应用程序中(即只读),而您必须使用 JPA 揭示数据库的内部设计,从而使消费者合同更有可能被打破关于变化。

关于您剩下的问题:

  • 我没有比较图表,并且像往常一样,它取决于数据结构和索引以及您的查询设计。JCR 实现具有内置缓存,您通常会迭代结果集。所以没有关于更快/更慢的一般性声明,这完全取决于用例。
  • 我做过类似的事情,我们对 Jackrabbit 的实现很满意,但我们使用的是 JDK7。我们在存储库中有所有数据(包括用户设置、应用程序设置等),根本没有 JPA 持久性。如果需要,还可以使用对象内容映射。
  • 是的,值得介绍。Jackrabbit 拥有自己的用户管理功能——您不必自己实现。访问控制可通过 JCR API 和 JAAS 获得。尽管我建议不要使用 JCA ResourceAdapter 来管理用户管理和访问控制,因为它不会公开 Jackrabbit API。
  • 关于数据完整性和备份的问题对于 JCR 或 JPA 来说并不特殊,它们都确保了某种级别的完整性(数据库完整性,JCR 执行引用完整性)并且两者都可以备份(db 备份,fs 备份)。两者都是访问数据的标准化方式,因此您甚至可以执行自己的备份逻辑。
于 2015-06-15T19:31:10.667 回答