Oracle Berkeley DB XML 系统调研

夹谷成仁
2023-12-01

Oracle Berkeley DB XML 系统调研

Oracle Berkeley DB XML 是一个可嵌入的开源 XML 数据库(EmbeddedNative Xml Database),可基于 XQuery 访问存储在容器中的文档,并对其内容进行索引。Oracle Berkeley DB XML 构建于 Oracle Berkeley DB 之上,并继承了其丰富的特性和属性(包括环境,各个级别的事务,Replication)。与Oracle Berkeley DB 一样,它通过应用程序运行,无需人为管理。Oracle Berkeley DB XML 主要功能模块包括有文档分析器、XML索引器以及 XQuery 引擎,实现了最快速、最高效的Xml数据检索。

XML特性:

BDB XML实现了W3C的标准,XML的命名空间和最新的XQuery标准.下面BDB XML的特性用来支持XML的管理理和查询,它们都是基于已经存在的标准.

1:容器(Container)一个单独的文件用来存贮多个或单个XML文档以及它们的索引文件和其他元数据.

2:索引:用来快速的选择文档的子集,可以提高查询的速度.

3:完整性:确保文档存储和恢复的一致性

4:元数据:存储在容器中的"关于文档的数据",和文档相关联.

5:更改和修正:更改和修正XML文档.包括添加和删除.

数据库特性;

BDB XML继承了大部分BerkeleyDB的特性,这使得BDB XML多年来一直处于领先地位.

1:嵌入式的数据访问:BDB XML像其他的库文件一样使用,它和应用程序是同一进程空间的.这样它访问数据时就不会像服务器/客户模式的数据库那样开销大.

2:最大可管理256TB的数据

3:环境支持:BDB XML支持多数据库,数据cache共享,事务,死锁检测,页面控制,锁控制和加密.BDB XML

可以和Berkeley DB共同使用一个环境.

4:原子操作:使用BDB XML的事务可以把复杂的读或写操作可以封装成一个原子操作,一个原子操作中的语句要么全部完成,要么一条也不完成.

5:单独操作:在事务中的一个单独操作可以忽略事务.就像没有事务一样.

6:可恢复性:事务可以保证在不可预测的系统故障的情况下的数据的有效性.

7:并发连接:通过BDB XML整合的隔离特性和死锁检测,可以保证多线程同时访问数据.

8:复制:BDB XML提供从主数据库复制数据到备份数据库,可以提高容错能力或用于负载平衡系统.

开发语言和平台

官方的BDB XML支持C++,Java,Perl,Python,PHPTcl语言.

 

第一步:下载

可以到Oracle公司的网站上去下载,当前最新版本为2.3.10。下载地址为:http://www.oracle.com/technetwork/products/berkeleydb/downloads/index.html?origref=http://blog.csdn.net/gobitan/article/details/1545998

选择Berkeley DB XML 2.5.16.msi Windows installer (24M);

 

第二步:安装

双击下载后的安装文件,一路默认安装直至安装完成。如果安装成功,系统会注册环境变量,此时在命令行中输入dbxml就可以进入BDB XMLShell操作了。

 

第三部:获取帮助
BDB XML Shell有一个内置的帮助,简单的在命令行输入help:
dbxml> help

Command Summary
---------------

#               - 注释。不做任何事情
abort           - 终端当前的事务
addAlias        - 加入一个别名到默认容器
addIndex        - 加入一个索引到默认容器
append          - 在查询表达式中添加节点规范
commit          - 提交当前的事务, 并且开始一个新的事务
contextQuery     - 用最后的结果当作上下文执行查询表达式
cquery          - 在默认容器的上下文中执行一个查询表达式
createContainer  - 建立一个新容器,它将变成默认的容器
debug           - 调试命令 -- 仅内部使用
delIndex        - 从默认的容器中删除一个索引
getDocuments     - 从默认容器中通过名称得到文档
getMetaData      - 从命名的文档中得到元数据
help            - 打印帮助信息,用'helpcommandName'获得扩展帮助
info            - 在默认容器上得到信息
insertAfter      - 在通过查询表达式选择的节点后面插入新的内容
insertBefore     - 在通过查询表达式选择的节点前面插入新的内容
listIndexes      - 列出在默认容器中的所有索引
lookupIndex      - 在默认的容器中执行索引查询
lookupStats      - 在默认容器上查询索引统计
openContainer    - 打开一个容器,并用它作为默认的容器
preload         - 预加载(打开)一个容器
print           - 打印最新的结果
putDocument      - 插入文档到默认容器中
query           - 在XmlManager上下文中执行一个表达式
queryPlan       - 打印为指定的查询表达式的查询计划
quit            - 退出程序
removeAlias      - 从默认容器中删除一个别名
removeContainer  - 删除一个容器
removeDocument   - 从默认容器中删除一个文档
removeNodes      - 从通过查询表达式指定的文档中删除内容
renameNodes      - 重命名通过查询表达式指定的节点
run             - 将指定的文件当作脚本运行
setApplyChanges  - 在默认更新上下文中修改 "apply changes" 状态
setBaseUri       -在默认上下文中设置基本uri
setLazy         - 在默认上下文中设置lazy评估开或关
setMetaData      - 为指定的文档设置元数据
setNamespace     - 在默认上下文中建立一个prefix->namespace绑定
setReturnType    - 在默认上下文中设置返回类型
setTypedVariable - 在默认上下文中设置变量为指定的类型
setVariable      - 在默认上下文中设置一个变量
setVerbose       -设置本shell的冗长
transaction      - 为所有后续操作建立一个事务
updateNodes      - 基于查询表达式和新内容更新节点上下文
upgradeContainer - 更新一个容器到当前的容器格式

任何给的的命令有附加的详细帮助。例如:
dbxml> help createContainer

createContainer -- 建立一个新容器,它将变成默认的容器

使用方法: createContainer <containerName>[n|in|d] [[no]validate]
建立一个新的默认容器;旧的默认容器被关闭。
第二个参数'd'建立一个完整文档存储容器(默认)
第二个参数'n'建立一个节点存储容器,并且'in'用DBXML_INDEX_NODES建立一个节点存储容器。
可选的第三个参数表示是否在插入时验证文档。
""的containerName建立一个in-memory容器。
这个命令用XmlManager::createContainer()方法。

帮助文本是关于命令和实现这个命令的API调用有价值的信息。这帮助你去查找API文档中更详细的相关章节,也是一个探索在交互式方式调用API的公共用法。

 

第四步:执行XQuery查询语句

BDB XML提供Shell命令行交互。有两种方式可以进入BDB XML Shell,即通过cmd进入然后键入dbxml命令和直接通过开始菜单找到Berkeley DB XML Shell进入。

1)创建容器

createContainer book

如果命令执行成功,系统会返回” Creating node storage container withnodes indexed”

此时创建了一个名叫book的容器。

createContainer是创建容器的命令,后面是容器的名称。

 

2)打开容器

       openContainer book

 

3)删除容器

       removeContainer book

 

4)插入文档

putDocument book1.xml '<bookList>

 <book>

    <name>Berkeley DBXML tutorial</name>

   <author>hujiahui</author>

   <price>37.00</price>

 </book>

</bookList>'

上面的命令存入了一个名叫book1XML文档。

如果命令执行成功,系统会返回” Document added, name = book1”   

putDocument是存入文档的命令,后面紧跟文档名称,最后是用单引号括起来的XML文档内容,并以s结束。

 

5)删除文档

       removeDocument book1.xml

 

6)显示查询结果

print

 

7)查询文档

query 'doc("book/book1.xml")'

 

8)查询元素

 query'collection("book")/bookList/book'

另一种查询元素的方法

 query'doc("book/book1.xml")/bookList/book'

 

9)增加节点(验证未通过)

append ./bookList element book '

<name>Inside Berkeley DBXML</name>

<author>liuhui</author>

<price>42.00</price>'

 

10)删除节点(验证未通过)

       removeNodes'doc("book/book1.xml")/bookList/book/author[. = "liuhui"]'

 

10)执行XQuery查询

query 'doc("phone.dbxml/phone1")'

如果成功,系统会返回

” 1 objects returned for eagerexpression 'doc("phone.dbxml/phone1")'”

然后键入print查看查询结果如下:

<phonebook>

<name>

<first>Tom</first>

<last>Jones</last>

</name>

<phonetype="home">420-203-2032</phone>

</phonebook>

11)使用XPath查询XML文档中的元素

插入测试数据

dbxml> putDocument bookList.xml'<booklist>

 <book lang="en">

   <ISBN>7121021161</ISBN>

    <Name>The Art ofUNIX Programming</Name>

    <Author>Eric StevenRaymond</Author>

   <Press>Addison-Wesley Professional</Press>

   <Price>59.00</Price>

 </book>

 <book lang="en">

   <ISBN>9787121039690</ISBN>

    <Name>Inside WidowsOperation System</Name>

   <Author>Russinovich,M.E.</Author>

   <Author>Solomon,D.A.</Author>

    <Press>MicrosoftPress</Press>

   <Price>99.00</Price>

 </book>

 <book lang="zh">

   <ISBN>0131411551</ISBN>

    <Name>Unix NetworkProgramming</Name>

    <Author>By W.Richard Stevens</Author>

    <Author>Bill Fenner</Author>

    <Author>AndrewM.Rudoff</Author>

   <Press>Addison-Wesley Professional</Press>

   <Price>79.00</Price>

 </book>

</booklist>'

执行XPath

dbxml> query 'doc("phone.dbxml /bookList.xml")/booklist/book/Name'

3 objects returned for eager expression'doc("xmlDb/bookList.xml")/booklist/book

/Name'

 

dbxml> print

<Name>The Art of UNIXProgramming</Name>

<Name>Inside Widows OperationSystem</Name>

<Name>Unix NetworkProgramming</Name>

12)使用XQuery谓词对查询结果进行过滤

上面查询出了XML文档中所有书籍的名称,如果只想查某类书籍,比如语言是中文的。那么我们可以采用谓词对查询结果进行过滤。

谓词的使用方法是直接在想要进行过滤的元素后加上一个以方括号包含表达式即可。表达式以@符号开头,并附以布尔表达式。比如只查中文的书籍布尔表达式为lang=”zh”,完整的查询语句如下:

dbxml> query'doc("xmlDb/bookList.xml")/booklist/book[@lang="zh"]/Name'

1 objects returned for eager expression'doc("xmlDb/bookList.xml")/booklist/book

[@lang="zh"]/Name'

 

dbxml> print

<Name>Unix NetworkProgramming</Name>

从上面结果可以看出,该查询语句过滤掉了lang属性不是zh的书籍的名字。

13)使用XQuery命令对查询结果进行包裹

在实际的应用中,往往需要将查询的结果进行包裹,形成新格式的XML数据。比如加上<html>标记包裹成一个HTML网页,或者加上根元素形成另外一份XML文档。

这里以将书籍名称的查询结果包裹为一个订单,即加上<order>根元素。包裹的方法是先写好包裹后的格式,然后通过{}将查询结果放入其中即可。如下所示:

dbxml> query'<order>{doc("xmlDb/bookList.xml")/booklist/book[@lang="zh"]/Name}</order>'

1 objects returned for eager expression'<order>{doc("xmlDb/bookList.xml")/bookl

ist/book[@lang="zh"]/Name}</order>'

 

dbxml> print

<order><Name>Unix NetworkProgramming</Name></order>

   通过包裹后的查询结果就形成了一份新的XML文档。

14)使用XQuery命令对查询结果进行排序

在使用SQL语句的时候,对查询结果进行排序可以说是再常见不过了。这里理所当然应该介绍如何在XQuery中实现这一功能。

XQuery查询结果进行排序比前面的几项要复杂一些。从下面的例子可以看出,它还涉及到了forwhereorder byreturn几个关键词。这里对forwherereturn几个关键词不做多介绍。用过SQL的对order by应该非常熟悉了,但要注意在XQuery中对排序的元素(相当于关系表中的字段)的引用于SQL有些不同。它需要在元素前加上$前缀,后面遵循XPath语言规范。如下所示:

dbxml> query 'for $book indoc("xmlDb/bookList.xml")/booklist/book

where $book/@lang="en"

order by $book/Name

return $book/Name'

 

2 objects returned for eager expression'for $book in doc("xmlDb/bookList.xml")/

booklist/book

where $book/@lang="en"

order by $book/Name

return $book/Name'

 

dbxml> print

<Name>Inside Widows OperationSystem</Name>

<Name>The Art of UNIXProgramming</Name>

 

15Schema Constraints模式约束

XML可以随意的使用模式来强制文档的相似性.大部分数据库支持模式约束.但是BDB XML有自己独一

的机制来存储数据,并使用模式来在不同的文档结构中展现数据.这是BDB独有的.在其他的XML数据库中没有.

回想我们的phonebook.dbxml它的结构如下

<phonebook>

<name>

<first>Tom</first>

<last>Jones</last>

</name> <phonetype="home">420-203-2032</phone>

</phonebook>

 

BDB XML要验证这个结构的有效性需要三步,

第一步:需要一个模式,受限于本文档

<?xml version="1.0"encoding="UTF-8"?>

<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="phonebook">

<xs:complexType>

<xs:sequence>

<xs:element name="name"minOccurs="1" maxOccurs="1">

<xs:complexType>

<xs:sequence>

<xs:element name="first"type="xs:string"/>

<xs:element name="last"type="xs:string"/> <:sequence>

<:complexType>

<:element>

<xs:element name="phone"minOccurs="0" maxOccurs="unbounded">

<xs:complexType>

<xs:simpleContent>

<xs:extension base="xs:string">

<xs:attribute name="type"type="xs:string"/>

<:extension>

<:simpleContent>

<:complexType>

<:element>

<:sequence> <:complexType>

<:element>

<:schema>

将XSD文件保存到本地G:\\schemaTest\t\ext1.xml。

 

第二步:创建一个容器,打开validation 选项

dbxml> createContainer validate.dbxml dvalidate

Creating document storage container, with validation

第三步, 在文档上加入模式,放入容器中..

dbxml> putDocument phone1 '

<phonebookxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation=

"G:\\schemaTest\t\ext1.xml">

<name>

<first>Tom</first>

<last>Jones</last>

</name>

 <phonetype="home">420-203-2032</phone>

</phonebook>' s

Document added, name = phone1

 

That document was successfully added because it conformsto the schema. Now, try to

add an invalid document.

 

dbxml> putDocument phone3 '

<phonebookxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation=

"G:\\schemaTest\\text1.xml">

<name>

<first>Tom</first>

<last>Jones</last>

</name>

<phonetype="home">420-203-2032</phone>

<cell-phone>430-201-2033</cell-phone>

</phonebook>' s

 

stdin:67: putDocument failed, Error: XML Indexer:Parse error in document at line, 10, char 17. Parser message: Unknown element 'cell-phone'

Since the schema doesn't define the cell-phone elementand we have schema validation enabled, BDB XML won't allow the document to beadded to the container.

第二次插入记录不成功,因为不符合我们提供的模式.XML 模式提供了强大的功能来约束XML文档结构和内容。

 类似资料: