JCR与JPA的DMS:性能,优点,缺点

时间:2015-06-12 11:10:02

标签: java jpa jcr jackrabbit dms

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

简短版本:文档是结构化或半结构化的内容。这是分层组织数据存储的用例。如果你不想为自己实现所有基本的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,非常好的文档)

顺便说一下。考虑到RESTful架构,JCR API和实现几乎完成了。因此,如果您考虑使用REST API,映射也会非常简单。此外,它允许消费者直接通过JCR API浏览内容,从而可以轻松地将内容集成到其他应用程序中(即只读),同时您必须使用JPA显示数据库的内部设计,从而使消费者合同更容易破解在变化。

关于你剩下的问题:

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