JackRabbit的前世今生
题记
写这系列有点老调重弹的味道,比如ahuaxuan已经在他的博客里对于JackRabbit 1.0做了很详细的阐述。之所以再写,是因为JCR推出了JCR 2.0,个人觉得有必要将一些新的特性再罗列一下。
问题提出
存取各种信息对于任何应用程序来说非常平常,大多数时候我们会把数据保存在关系数据库中。数据库处理规范数据类型十分在行,但是在处理如图像、文档等二进制数据时却不是那么得心应手。
尽管可以用文件系统作为替代——而且它们还提供了更好的性能。但它们既没有提供用于搜索信息的查询语言,也没有提供表示关系或事务的概念。
什么是JSR-170
幸运的是,被称为Java内容仓库(Java Content Repository,JCR)的JSR-170,试图以独立于具体实现的方式解决这些(以及其它)问题。即,不论底层资源(如,数据库,本地或虚拟文件系统)是什么,API都将相同。在数据存储之上,JCR提供诸如访问粒度控制、版本控制、内容事件、全文检索和过滤等内容服务。
采用JCR能带来什么呢?包括如事务、伸缩性、数据库端的查询、使用超大文件带来的真正好处、流、访问控制和文件系统端的层次结构,以及诸如版本标定、全文检索,以及“数据优先”方法。
由Day Software领导的JSR-170背后的专家组付出了艰辛的劳动。2005年6月完成,在javax.jcr包中,API包含了大约50个类(主要是接口和异常)。
2006年早些时候,我们的主角JackRabbit登场了, 它是JCR 1.0版本的参考实现,除了JackRabbit之外,还有许多开源或者商业的JCR 1.0的不同实现。
JCR概览
JCR 建立在内容仓库的概念之上。仓库使用“树结构”保存信息。
树由节点和属性组成。1个节点有且只有1个父亲,有任意数目的孩子(子节点)和任意数目的属性。1个属性有且只有一个父亲(它是节点),它没有子节点,由一个名字和一个或多个值组成。
属性值的类型可以是:布尔(Boolean)、日期(Date)、双精(Double),长整(Long),字符串(String)或流(Stream)。在JCR里,只有属性可以被用来存储信息,节点则被用来创建树内部的“路径”。
你可以把JCR想成类似文件系统的目录结构,节点是目录,属性则是实际的文件。
JSR-170 提供了标准的JCR API接口包 -- javax.jcr包。API的核心类是Session,它代表客户端和仓库之间的连接。这个包还包含了那些组成仓库的接口的定义:Workspace,Credentials,Node,Property,Item(Node和Property的超类)和Value。
- javax.jcr.query包负责处理查询,
- javax.jcr.nodetype包负责定义节点类型。
- javax.jcr.version、javax.jcr.observation、javax.jcr.lock负责可选级别的功能。
JSR 283之后的JCR 2.0
JSR-283 旨在从以下几个方面改进JCR 1.0:
- 访问控制和节点类型的管理
- 通过新的标准节点类型(包括元信息和国际化)改进互操作性
- 扩展内容建模能力
- 联邦、交叉仓库和交叉工作区(Workspace)功能
- 积极发展现有查询语言、版本标定和观察
- Remoting和客户/服务器协议映射(译者注:Remoting是采用分布式进行编程的一种技术,主要用于管理跨应用程序域的同步和异步RPC会话。默认情况下,Remoting使用HTTP或TCP协议,并使用XML编码的SOAP或本机二进制消息格式进行通信。)
因此JCR 2.0的API和JCR 1.0有很大的不同。可以参考:
http://www.day.com/maven/jdiff-jcr1-jcr2/changes.html
JackRabbit与NoSQL
“NoSQL“这个有点浮泛的词现在代表着几大类数据库,比如key-value型数据库,面向文档的数据库等等。
面向文档的非关系数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能,一些传统的应用,比如博客、Wiki等等,都是很适合应用面向文档的数据库的场景。
JackRabbit就是一种面向文档的数据库,它和MongoDB,CouchDB的功能十分接近,优势在于JackRabbit遵从JCR标准,日后可以迁移到其他同样兼容JCR的性能更好的商业解决方案上。 
JackRabbit的前世今生的更多相关文章
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- docker4dotnet #1 – 前世今生 & 世界你好
作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...
- Atitit 智能云网络摄像机的前世今生与历史 优点 密码默认888888
Atitit 智能云网络摄像机的前世今生与历史 优点 密码默认888888 用户名admin 密码aaaaaa 网络摄像机是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像通过网络传 ...
- 阿里开源消息中间件RocketMQ的前世今生-转自阿里中间件
昨天,我们将分布式消息中间件RocketMQ捐赠给了开源软件基金会Apache. 孵化成功后,RocketMQ或将成为国内首个互联网中间件在Apache上的顶级项目. 消息一出,本以为群众的反应是这样 ...
- 建立jackrabbit内容仓库实例
jackrabbit需要内容仓库主目录和内容仓库配置文件这两部分的信息才能创建一个运行时内容仓库实例. 1.内容仓库主目录结构 2.Repository.xml的配置文件结构
- JavaScript的前世今生
和CSS一样,JavaScript在各浏览器下并非完全一致,它所带来的兼容性问题时常困扰着我们,以至于现在“能否处理流行浏览器的兼容性问题”成为了检验一个程序员是否合格的标准之一.了解JavaScri ...
- 主成分分析PCA的前世今生
这篇博客会以攻略形式介绍PCA在前世今生. 其实,主成分分析知识一种分析算法,他的前生:应用场景:后世:输出结果的去向,在网上的博客都没有详细的提示.这里,我将从应用场景开始,介绍到得出PCA结果后, ...
- SpringMVC源码剖析(二)- DispatcherServlet的前世今生
上一篇文章<SpringMVC源码剖析(一)- 从抽象和接口说起>中,我介绍了一次典型的SpringMVC请求处理过程中,相继粉墨登场的各种核心类和接口.我刻意忽略了源码中的处理细节,只列 ...
随机推荐
- php curl 多线程方法
<?php /** * curl 多线程 * @param array $array 并行网址 * @param int $timeout 超时时间 * @return array */ fun ...
- linux 下安装 mysql5.7.16安装
1.groupadd mysql ## 添加一个mysql组 2.useradd -r -g mysql mysql ## 添加一个用户 3.解压缩下载的包,tar -xzvf /da ...
- HTTP的客户端识别与cookie机制
本文是<HTTP权威指南>的读书笔记 Web服务器可能同时在与数千个客户端同时进行会话,服务器需要记录下它们在与谁交谈,而不是认为所有的请求都来自于匿名客户端.在HTTP中可以有以下几种方 ...
- 创建dll教程
先看我的总结: 总结: 1.头文件中如果想以C形式提供,要判断,如果定义了 _cplusplus, extern "c"{ 这里写接口声明 } 2.接口声明中,要表明接口接入点的 ...
- touch事件中的touches、targetTouches和changedTouches详解
touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表 通过一个例子来区分一下触 ...
- 理解Angular中的$apply()以及$digest()
$apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...
- js 控制文本只能输入数字
代码如下: <input onkeypress="setNumber()"><script> function setNumber(){ var keyCo ...
- WinForm各种API---时时更新
好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 本文原文地址:http://www.cnblogs.com/hqxc/p/6160685.html 徐淳 [D ...
- JS 格式化当前时间
Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth()+1, //月份 "d+& ...
- sql查删更
//查询#SELECT * FROM user_cawefwfrd where usewwr_cawrqqd_qaid=2252227//删除#DELETE FROM user_cauyuyurd w ...