使用现有的JCR实现有几个好处,比如Jackrabbit或ModeShape。首先也是最重要的,你可以立即免费获得很多功能:
- Hierarchical数据存储-许多数据自然是分层的,JCR存储库允许您以应用程序访问数据的方式来组织数据。任何以URI、日期/时间、类别或文件夹结构为关键字的内容都自然适合于在repository.
- Use中存储标准Java API -- JCR API是带有TCK的标准Java API,这意味着您的应用程序可以依赖于标准行为,而不是绑定到特定的JCR types.
- Data模式实施-您可以选择是否以及在何处通过定义和使用节点演进来实施节点结构和属性值-您的数据结构可能会随着时间的推移而演变。而JCR使得do.
- Query和全文搜索变得非常容易-您的应用程序可以在数据中导航,或者它们可以独立于位置查询内容。JCR查询语言非常丰富,它们支持全文search.
- Transactions -您可以控制事务边界,这意味着JCR Session可以参与由您的应用程序或其container.
- Events控制的JTA事务-当添加、更改节点和/或属性时,可以通知您的应用程序,或者通过跨多个进程集群JCR Repository来对应用程序进行removed.
- Clustering缩放。每个实现配置集群的方式不同,但是它们对客户端applications.
- Versioning的行为是相同的- JCR包括一个用于内容版本控制的标准机制。它可能并不适合所有的用例,但是当它是一个fit.
- Locking时,它是非常方便的- JCR包含一个用于短期锁定的标准机制,当您的应用程序需要确保存储库的某些部分只由一个进程更新时,这是非常有用的。
如果这些特性中的一些对您很重要,那么您肯定应该考虑重用现有的实现,而不是滚动自己的实现-否则您将把所有时间都花在实现这些类型的特性上。
但是,如果这些功能都不适合您的用例,那么您应该考虑其他数据存储技术:
当您的数据非常受约束时,当您的架构不太可能频繁更改时,或者当您的数据是平面的(一些键类型的大量值)时,
- 关系数据库非常有用。(请注意,许多JCR实现可以将内容存储在关系数据库中,因此“我必须将数据存储在关系数据库中”并不是让您的应用程序直接使用关系数据库的好理由。当您需要通过唯一键存储任意值,并且所有访问都是通过gets和puts进行时,database.)
- Key-value存储非常有用。这些值对于store.
- Document存储通常是不透明的,这与键值存储类似,只是存储知道值的结构。一些支持queries.
- Other存储技术的文档存储有自己的甜蜜点。
其他需要考虑的事情是,您是否需要或想要一个最终一致的数据库或一个强一致的数据库。在强一致性数据库上编写许多“传统”应用程序要容易得多,事实上,大多数JCR存储库(包括Jackrabbit和ModeShape)都是强一致性的。