使用现有JCR实施有几个好处,例如Jackrabbit或ModeShape。首先,您可以立即免费获得许多功能:
- 分层数据存储 - 大量数据自然是分层的,JCR存储库允许您以应用程序访问数据的方式组织数据。任何由URI,日期/时间,类别或文件夹结构键入的内容都非常适合存储在存储库中。
- 使用标准Java API - JCR API是带有TCK的标准Java API,这意味着您的应用程序可以依赖于标准行为,而不是绑定到特定的JCR实现。
- 灵活的架构实施 - 您可以选择是否以及在何处通过定义和使用节点类型来强制执行节点结构和属性值。
- 数据发展 - 您的数据结构可能会随着时间的推移而发展,而JCR使这很容易实现。
- 查询和全文搜索 - 您的应用可以浏览数据,也可以独立于位置查询内容。 JCR查询语言非常丰富,它们支持全文搜索。
- 交易 - 您可以控制交易边界,这意味着JCR会话可以参与由您的应用程序或其容器控制的JTA交易。
- 事件 - 添加,更改或删除节点和/或属性时,可以通知您的应用程序。
- 群集 - 通过在多个进程中集群JCR存储库来扩展应用程序。每种实现都以不同方式配置群集,但它们对客户端应用程序的行为相同。
- 版本控制 - JCR包含用于版本控制内容的标准机制。它可能不适用于所有用例,但在适合时非常方便。
- 锁定 - JCR包含一种短期锁定的标准机制,当您的应用程序需要确保部分存储库仅由一个进程更新时,这种机制非常有用。
如果其中某些功能对您很重要,那么您一定要考虑重复使用现有的实现而不是自己动手 - 否则您将花费所有时间来实现这些功能。
但是,如果这些功能都不适合您的用例,那么您应该考虑其他数据存储技术:
- 当您的数据受到很大约束,您的架构不太可能经常更改,或者您的数据不稳定时(很多几个键类型的值),关系数据库的效果很好。 (请注意,许多JCR实现可以将内容存储在关系数据库中,因此“我必须将数据存储在关系数据库中”并不是您的应用程序直接使用关系数据库的理由。)
- 当您需要通过唯一键存储任意值时,键值存储很有效,并且所有访问都是通过gets和puts进行的。这些值通常对商店来说是不透明的。
- 文档存储类似于键值存储,但商店知道值的结构。某些文档存储支持查询。
- 其他存储技术有自己的最佳点。
需要考虑的其他事项是您是否需要或想要最终一致的数据库或强一致的数据库。针对强一致性数据库编写许多“常规”应用程序要容易得多,实际上大多数JCR存储库(包括Jackrabbit和ModeShape)都非常一致。