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

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

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

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

  • 更新:尽管已经详细回答了这个问题,但从更实际的角度来看,某些人可能对其使用有更严格的了解。我个人越来越关注以下与技术无关的问题:
  • 文档:Jackrabbit的文档不多,OCM的指南在第一段中包含无效链接,一些示例搜索查询由于未知原因引发了异常,在非常基本的教程中有一个TODO,并且它的独立服务器在JDK8中无法正常工作根本没有记录。
  • 成熟度:Jackrabbit Oak似乎仍在开发中,其他解决方案看起来要么被放弃,要么正在边缘化。
  • 社区:与JPA相反,对JCR进行研究可以减少hits的使用。当刚接触该技术的项目团队陷入(重大)问题中时,这可能是一个真正的问题。
  • 最佳答案

    简短版本:文档是结构化或半结构化的内容。这就是用于分层组织的数据存储的用例。如果您不想自己实现所有基本的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可以进行引用完整性),并且都可以备份(数据库备份,fs备份)。两者都是访问数据的标准化方法,因此您甚至可以执行自己的备份逻辑。
  • 关于java - DMS的JCR与JPA:性能,优点,缺点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30801604/

    10-13 04:31