何时使用JCR(内容存储库)而不是其他选项?

我试图评估像Jackrabbit和ModeShape的内容库( JSR283 ),但我必须承认,我不明白什么问题在第一位解决,即使它是一个不错的select项目。 你认为哪种情况是最好的解决scheme? 与关系数据库不同,除了大小? 为什么? 指出现实世界的例子的额外点。

提前致谢。

JCR存储库与RDBMS不同,因为JCR存储库:

  • 是分层的,允许您将您的内容组织在一个与您的需求紧密匹配的结构中,并且相关信息经常存储在一起,因此很容易导航
  • 是灵活的,允许内容适应和演变,使用节点types的系统,可以完全“无模式”全面限制(例如,像一个关系数据库)
  • 使用标准的Java API(例如,javax.jcr)
  • 摘要是真正存储信息的地方:许多JCR实现可以将内容存储在各种关系数据库和其他存储中,有些可以通过JCR API公开非JCR存储,有些可以将多个存储联合到单个虚拟存储库中。
  • 支持查询和开箱即用的全文search
  • 支持事件,locking,版本控制和其他function

您当然可以在自己的应用程序中构build这些function的全部或部分function,但这可能会远离您的应用程序的主要目的。

什么样的应用程序可以从这些function中受益? 内容pipe理系统已经使用了很久的资源库,JCR(和Jackrabbit)确实是出于对通用标准API访问不同内容库的需求(参见JSR-170和JSR-283 )。

另一个例子是文件pipe理系统,它pipe理电子文件(通常是纸质文件的图像)并提供search和查询。 DMS已经使用了一段时间了。

工件pipe理系统可以使用存储库来pipe理数字工件(通常是文件)以及附加信息(元数据)。 JCR在这里工作的很好,因为你可以将元数据存储在与文件相同的位置:理解这些额外属性的元数据可以看到它们,不关心的不必看到它们。 我知道Artifactory是一个使用JCR的Maven仓库实现。 还有用于pipe理Web服务工件,数据服务工件和testing工件的存储库。

但是JCR存储库不用于pipe理文件。 JCR使用节点层次结构的简单概念,其中节点可以包含命名属性(具有一个或多个值)和子节点。 允许的属性和子节点完全由节点types决定,节点types可以根据需要逐节点更改和混合。 JCR预先定义了一些常用的内置节点types,比如用来代表仓库中的文件和文件夹。 您可以重用这些内置types,扩展它们,或者编写自己的types。 许多人主张使用mixin几乎是作为方面或方面,所以如果一个节点需要采取一个方面,你可以简单地添加一个mixin到节点。

JCR旨在轻松支持将XML内容导入到存储库中,其中每个元素映射到一个节点,并且每个属性映射到一个属性。 很多东西用XML(或YAML或JSON)表示,所有这些都可以很容易地表示出来并存储在一个JCR库中。 作为示例,请考虑存储configuration信息(通常可能存储在多个XML文件中)的JCR存储库。 JCR可以对该信息进行版本化,允许从多个进程访问它,启用查询和search,并在内容发生变化时通知应用程序。

有几个很好的JCR的概述,更多的细节和例子。 其中一些是:

  • Titus Barik 介绍Java Content Repository API (不再可用)
  • 由David Nuescheler 介绍JCR
  • JCR和Apache Jackrabbit由Jukka Zitting介绍
  • ModeShape由Randall Hauch 概述
  • Java内容库: Bertrand Delacretaz两全其美