【问题标题】:JCR vs JPA for a DMS: performance, benefits, drawbacksDMS 的 JCR 与 JPA:性能、优点、缺点
【发布时间】:2015-06-12 11:10:02
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java jpa jcr jackrabbit dms


    【解决方案1】:

    短版:文档是结构化或半结构化的内容。这就是分层组织的数据存储的用例。如果您不想为自己实现所有基本的 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 持久性。如果您需要,还可以使用Object Content Mapping
    • 是的,值得介绍。 Jackrabbit 拥有自己的用户管理功能——您不必自己实现。访问控制可通过 JCR API 和 JAAS 获得。虽然我建议不要使用 JCA ResourceAdapter 来管理用户管理和访问控制,因为它不公开 Jackrabbit API。
    • 关于数据完整性和备份的问题对于 JCR 或 JPA 来说并不特殊,它们都可以在一定程度上确保完整性(数据库完整性,JCR 执行引用完整性),并且都可以备份(db 备份,fs 备份)。两者都是访问数据的标准化方式,因此您甚至可以执行自己的备份逻辑。

    【讨论】:

    • 好点,尤其是戴维斯模型非常有帮助,谢谢!我更新了我的问题以解决我剩下的问题。
    • "所以没有关于更快/更慢的一般性声明" :在使用 Jackrabbit 多年的经验之后,我可以自信地做出一般性声明,即 Jackrabbit 存在严重的性能问题除了玩具尺寸数据集以外的任何东西。
    猜你喜欢
    • 2014-05-09
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2023-04-04
    • 2011-11-03
    • 2011-01-26
    • 2017-04-29
    相关资源
    最近更新 更多