前一个项目终于进入尾声,Bug基本都解决掉了。本以为可以喘口气,稍微Relax一下,不想新项目又过来了。这次的项目对实时性要求非常高,考虑用 No SQL。因为之前又玩过一点Couch DB, 于是顺理成章的被抓过去调研 Berkeley DB。

1、 首先来摆摆家谱。

Berkeley DB 有三个版本。

Oracle BDB Core Edition

这个版本是用ANSI C编写的,可作为一个库使用,针对不同的编程语言提供多种
接口,包括ANSI C,Java(通过JNI),Perl,PHP和Python。

Oracle BDB XML Edition

XML的版本的BDB允许我们轻松地存储和检索XML文档,支持使用XQuery来访问存储的XML文档。

Oracle BDB Java Edition

Java版是一个纯Java,高性能,高度灵活的以键值对格式来存储的嵌入式数据库。它支持事务,直接使用
EJB 3.0样式的annotations,同时提供低级别的类似于集合访问的键值检索API。

2、特色

特点描述
数据存储 Data Store (DS)单写,多读
并行数据存储
Concurrent Data Store (CDS)
多写,多读(快照)
事务性数据存储
Transactional Data Store (TDS)
在CDS之上的完整ACID支持
高可用性
High Availability (HA)
容错支持,故障恢复

当然不同的版本特点也不一样,你不能指望Java版本做的跟XML一样强大。

 DS CDS TDS HA

BDB XML Edition

BDB Java Edition

 

 

3、安装

首先当然是下载, http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html

下了当前最新的2.5.16 XML版,Windows下的 msi 安装包。

image

安装实在So easy, 一路Next就搞定。

安装完后需要设置一下环境变量,把 Berkeley DB XML 2.5.16安装目录\bin 加到Path。

4、用用命令行,尝尝鲜

随便打开个命令行,敲入 dbxml

image

首先创建一个容器来存储XML文档。例如,创建一个目录容器来存储书籍条目。

image

注意 BDB 会在你执行dbxml 命令式所在的目录创建一个 .dbxml 文件。前面我是在F:\>执行的dbxml 所以在F盘下就会有一个catalog.dbxml文件。

接下来,使用的BDB XML 的 putDocument 命令来添加XML文件。

putDocument catalog1 '<catalog title="Oreilly Book"
publisher="Oreilly Publishing">
<book date="November-December 2008">
<title>Oreilly.Learning.XNA.4.0.Dec.2010</title>
<author>Aaron Reed</author>
<chapter/>
</book>
</catalog>' s

image

刚开始还报个错,如上图所示,提示没有默认的容器。要先open一下,再来执行就没问题了。

openContainer catalog.dbxml

image

单引号用于任何命令或参数,跨越多行或者包含空格。参数 s ,意即String,指示添加的是一个字符串。

putDocument 不仅支持字符串,还支持文件及XQuery 表达式。

把如下这段XML保存到 Oreilly.Building.Wireless.Sensor.Networks.xml 文件,注意放在执行dbxml 命令所在的目录。

<catalog title="Oreilly Book"
publisher="Oreilly Publishing">
<book date="December 2010">
<title>Oreilly.Building.Wireless.Sensor.Networks.Dec.2010</title>
<author>Robert Faludi</author>
<chapter/>
</book>
</catalog>

执行命令:putDocument catalog2 Oreilly.Building.Wireless.Sensor.Networks.xml f

image

参数 f 代表是从 File 文件中来存取。

既然已经加了两个进去了,用 getDocuments 命令来看看是不是有两个。

image

可以用 print 命令来查看具体内容。

image

当然有添加就有删除

removeContainer- 删除一个容器
removeDocument-从默认容器中删除文件

5、试试XQuery方式的查询

query collection('catalog.dbxml')/catalog/book/title/text()

image

来个稍微复杂点的表达式:

查询 Oreilly.Building.Wireless.Sensor.Networks.Dec.2010 这本书的作者

query collection('catalog.dbxml')/catalog/book[title="Oreilly.Building.Wireless.Sensor.Networks.Dec.2010"]/author/text()

image

暂时就玩了这么点,后续跟进中。