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