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

Jou*_*ner 3 java jpa jackrabbit jcr dms

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

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

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

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

更新:尽管已经详细回答了这个问题,但从更实际的角度来看,可能有人会对它的使用有更严格的了解。我个人越来越关注以下与技术无关的问题:

  1. 文档:Jackrabbit的文档很差,OCM的指南第一段中包含一个无效链接,一些示例搜索查询由于未知原因引发了异常,非常基础的教程中有一个TODO,并且它的独立服务器在JDK8中无法正常工作,完全没有记录。
  2. 成熟度:Jackrabbit Oak似乎仍在开发中,其他解决方案似乎要么被放弃,要么正在边缘化。
  3. 社区:在对面JPA,做JCR导致更少的方式研究命中。当刚接触该技术的项目团队陷入(重大)问题中时,这可能是一个真正的问题。

Ger*_*cke 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,周围有很好的文档)

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

关于您剩余的问题:

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