<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle Berkeley DB 中国研发团队的博客 &#187; 蔡瀛</title>
	<atom:link href="http://www.bdbchina.com/author/yingcai/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Fri, 09 Jul 2010 06:44:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Berkeley DB XML 多线程添加文档例子</title>
		<link>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/</link>
		<comments>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 06:56:02 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Ying Cai]]></category>
		<category><![CDATA[蔡瀛]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=809</guid>
		<description><![CDATA[
import java.io.File;
import java.util.concurrent.CountDownLatch;

import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockDetectMode;
import com.sleepycat.dbxml.XmlContainer;
import com.sleepycat.dbxml.XmlContainerConfig;
import com.sleepycat.dbxml.XmlDocument;
import com.sleepycat.dbxml.XmlDocumentConfig;
import com.sleepycat.dbxml.XmlException;
import com.sleepycat.dbxml.XmlManager;
import com.sleepycat.dbxml.XmlManagerConfig;
import com.sleepycat.dbxml.XmlQueryContext;
import com.sleepycat.dbxml.XmlResults;
import com.sleepycat.dbxml.XmlTransaction;
import com.sleepycat.dbxml.XmlUpdateContext;

public class DbxmlThreads extends Thread {

        public static XmlManager mgr = null;
        public static String containerName = "test.dbxml";
        [...]]]></description>
			<content:encoded><![CDATA[<pre name="code" class="java:nogutter">
import java.io.File;
import java.util.concurrent.CountDownLatch;

import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockDetectMode;
import com.sleepycat.dbxml.XmlContainer;
import com.sleepycat.dbxml.XmlContainerConfig;
import com.sleepycat.dbxml.XmlDocument;
import com.sleepycat.dbxml.XmlDocumentConfig;
import com.sleepycat.dbxml.XmlException;
import com.sleepycat.dbxml.XmlManager;
import com.sleepycat.dbxml.XmlManagerConfig;
import com.sleepycat.dbxml.XmlQueryContext;
import com.sleepycat.dbxml.XmlResults;
import com.sleepycat.dbxml.XmlTransaction;
import com.sleepycat.dbxml.XmlUpdateContext;

public class DbxmlThreads extends Thread {

        public static XmlManager mgr = null;
        public static String containerName = "test.dbxml";
        public static Environment dbEnv = null;
        private static XmlContainer cont = null;

        static {
                EnvironmentConfig envConf = new EnvironmentConfig();
                envConf.setThreaded(true);
                envConf.setAllowCreate(true);
                envConf.setTransactional(true);
                envConf.setInitializeCache(true);
                envConf.setInitializeLocking(true);
                envConf.setInitializeLogging(true);
                envConf.setCacheSize(64 * 1024 * 1024);
                envConf.setLockDetectMode(LockDetectMode.DEFAULT);

                XmlManagerConfig xmlMgrConfig = new XmlManagerConfig();
                xmlMgrConfig.setAdoptEnvironment(true);

                File dbHome = new File(".");

                try {
                        dbEnv = new Environment(dbHome, envConf);
                        mgr = new XmlManager(dbEnv, xmlMgrConfig);

                        // 创建XmlContainer
                        if(mgr.existsContainer(containerName)!=0)
                                mgr.removeContainer(containerName);

                        XmlContainerConfig containerConf = new XmlContainerConfig();
                        containerConf.setTransactional(true);
                        containerConf.setAllowCreate(true);
                        containerConf.setContainerType(XmlContainer.NodeContainer);
                        cont = mgr.openContainer(containerName, containerConf);
                        cont.setAutoIndexing(false);
                } catch (Exception e) {
                        e.printStackTrace();
                }

        }

        private String name;
        private CountDownLatch doneSignal;

        DbxmlThreads(String name, CountDownLatch doneSignal) {
                this.name = name;
                this.doneSignal = doneSignal;
        }

        public void run() {
                XmlTransaction txn = null;
                try {
                        String content = "<"+name+">I am "+name+"</"+name+">";
                        for (int i = 0; i < 100; i++) {
                                XmlDocumentConfig dc = new XmlDocumentConfig();
                                dc.setGenerateName(true);
                                System.out.println(name+" insert "+i);
                                txn = mgr.createTransaction();

                                XmlDocument doc = mgr.createDocument();
                                doc.setContent(content);
                                cont.putDocument(txn, doc, dc);

                                txn.commit();
                        }
                } catch (XmlException e) {
                        System.out.println("insert error:" + e.getMessage());
                } finally {
                        doneSignal.countDown();
                }
        }

        public static void main(String[] args) throws Exception {

                CountDownLatch doneSignal = new CountDownLatch(5);
                DbxmlThreads threadA = new DbxmlThreads("A", doneSignal);
                DbxmlThreads threadB = new DbxmlThreads("B", doneSignal);
                DbxmlThreads threadC = new DbxmlThreads("C", doneSignal);
                DbxmlThreads threadD = new DbxmlThreads("D", doneSignal);
                DbxmlThreads threadE = new DbxmlThreads("E", doneSignal);

                threadA.start();
                threadB.start();
                threadC.start();
                threadD.start();
                threadE.start();

                doneSignal.await();

                XmlQueryContext qc = mgr.createQueryContext();
                String query = "collection('"+containerName+"')/A";
                XmlResults res = mgr.query(query, qc);
                System.out.println("The results size is: "+res.size());
                res.delete();
                cont.close();
                mgr.close();
        }

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Xml 2.5 新特性详解一： 概述</title>
		<link>http://www.bdbchina.com/2009/09/berkeley-db-xml-25-%e6%96%b0%e7%89%b9%e6%80%a7%e8%af%a6%e8%a7%a3%e4%b8%80%ef%bc%9a-%e6%a6%82%e8%bf%b0/</link>
		<comments>http://www.bdbchina.com/2009/09/berkeley-db-xml-25-%e6%96%b0%e7%89%b9%e6%80%a7%e8%af%a6%e8%a7%a3%e4%b8%80%ef%bc%9a-%e6%a6%82%e8%bf%b0/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 10:15:30 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Ying Cai]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=554</guid>
		<description><![CDATA[2009年9月14日，Berkeley DB Xml 发布了最新的2.5版本 (包含最新发布的Berkeley DB　4.8版本)，此版本增加了新功能，并对上一个版本的所有bug进行了修复，是一个更快更加稳定的版本，推荐大家升级。下载地址在:http://www.oracle.com/technology/software/products/berkeley-db/index.html。 Berkeley DB Xml 2.5 新特性主要有一下几个方面：
1. 自建索引
2. 在wholeDocument存储模式下的压缩存储
3. Debugging API 和 debug 命令
4. 用户自定义XQuery external 函数
5. XmlResults 增强
6. 更高效的节点存储模式

接下来我们具体了解一下这些新特性：
1. 自建索引
自建索引是Berkeley DB Xml 2.5版的重大改进之一，他的主要功能是自动建立索引无需用户手动添加。在Berkeley DB XMl 2.5中，如果对XmlContainer打开了自建索引功能（通过XmlContainer.setAutoIndexing()方法 或者XmlIndexSpecification.setAutoIndexing()方法），当发现有新的叶子element结点或叶子attribute结点时，XmlContainer会对新的结点增加两个索引。 这两个索引分别是node-*-equality-string 和 node-*-equality-double(*表示结点名字)，在默认情况下自建索引功能是被打开的。
下面我们来看一个列子，看自建索引是如何生效的
ying@bdbcn3:~$ dbxml

dbxml&#62; createcontainer test.dbxml
Creating node storage container

dbxml&#62; putdocument 1.xml "&#60;root&#62;&#60;a att1='test'&#62;test&#60;/a&#62;&#60;b/&#62;&#60;/root&#62;" s
Document added, name = 1.xml

dbxml&#62; listindex
Index: node-element-equality-string node-element-equality-double for node [...]]]></description>
			<content:encoded><![CDATA[<p>2009年9月14日，Berkeley DB Xml 发布了最新的2.5版本 (包含最新发布的Berkeley DB　4.8版本)，此版本增加了新功能，并对上一个版本的所有bug进行了修复，是一个更快更加稳定的版本，推荐大家升级。下载地址在:<a title="http://www.oracle.com/technology/software/products/berkeley-db/index.html" href="http://www.oracle.com/technology/software/products/berkeley-db/index.html" target="_blank">http://www.oracle.com/technology/software/products/berkeley-db/index.html</a>。 Berkeley DB Xml 2.5 新特性主要有一下几个方面：</p>
<p>1. 自建索引<br />
2. 在wholeDocument存储模式下的压缩存储<br />
3. Debugging API 和 debug 命令<br />
4. 用户自定义XQuery external 函数<br />
5. XmlResults 增强<br />
6. 更高效的节点存储模式</p>
<p><span id="more-554"></span></p>
<p>接下来我们具体了解一下这些新特性：</p>
<h3>1. 自建索引</h3>
<p>自建索引是Berkeley DB Xml 2.5版的重大改进之一，他的主要功能是自动建立索引无需用户手动添加。在Berkeley DB XMl 2.5中，如果对XmlContainer打开了自建索引功能（通过XmlContainer.setAutoIndexing()方法 或者XmlIndexSpecification.setAutoIndexing()方法），当发现有新的叶子element结点或叶子attribute结点时，XmlContainer会对新的结点增加两个索引。 这两个索引分别是node-*-equality-string 和 node-*-equality-double(*表示结点名字)，在默认情况下自建索引功能是被打开的。</p>
<p>下面我们来看一个列子，看自建索引是如何生效的</p>
<pre>ying@bdbcn3:~$ dbxml

dbxml&gt; createcontainer test.dbxml
Creating node storage container

dbxml&gt; putdocument 1.xml "&lt;root&gt;&lt;a att1='test'&gt;test&lt;/a&gt;&lt;b/&gt;&lt;/root&gt;" s
Document added, name = 1.xml

dbxml&gt; listindex
Index: node-element-equality-string node-element-equality-double for node {}:a
Index: node-attribute-equality-string node-attribute-equality-double for node {}:att1
Index: node-element-equality-string node-element-equality-double for node {}:b
Index: unique-node-metadata-equality-string for node {http://www.sleepycat.com/2002/dbxml}:name
4 indexes found.</pre>
<h3>2. whole document 模式压缩存储</h3>
<p>在Berkeley DB Xml 2.5中对whole document存储模式添加了压缩储存功能。经过压缩可以提高文档的储存速度和降低存储空间大小。 默认情况下使用unix系统的zlib进行压缩和解压，用户也可以使用自己的压缩和解压缩算法（通过实现XmlCompression接口）。</p>
<p>经过测试，在存储100万个4k大小的文档的XmlContainer,启用压缩的大小为398，516k，不使用压缩的大小为893，500k，可以节省大约55%的空间。</p>
<pre>ying@bdbcn3:~$ du -sk *.dbxml
398516  Compressed.dbxml
893500  Uncompressed.dbxml</pre>
<p>如果用户需要使用自己的压缩算法，可以实现XmlCompression接口， 主要实现compress()方法用于压缩，decompress()方法用于解压缩。 具体例子请参考安装包中example/cxx/misc/compression.cpp或者后续文章。</p>
<h3>3. Debugging API和debug命令</h3>
<p>DB XML shell 增加了一个debug命令， 启动shell后键入debug命令会进入debug模式， 可以用来调试XQuery语句。</p>
<p>例子：</p>
<pre>dbxml&gt; debug "collection('test.dbxml')/root/a"

debug&gt; help

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

backtrace     - Prints a stack trace of the currently evaluating query
break         - Sets a break point
breakpoints   - Lists the break points set
continue      - Continues execution of the query
disable       - Disables the break point indentified by the numeric argument
enable        - Enables the break point indentified by the numeric argument
optimizeFocus - Enables or disable focus optimisations
frame         - Changes the current frame
help          - Print help information.  Use 'help commandName' for extended help
lazy          - Enables or disable lazy evaluation optimisations
list          - Prints the query at the current frame
next          - Skips query execution to the end of the current sub-expression
projection    - Enables or disable document projection optimisations
query         - Executes a query in the context of the current frame
queryplan     - Prints the query plan for the expression at the current frame
quit          - Exits the debugger
run           - Runs the query. If the query is already running it will be re-started
step          - Skips query execution forward one sub-expression

debug&gt; run
&lt;a att1="test"&gt;test&lt;/a&gt;

Query completed.</pre>
<p>Debugging API调用是通过实现XmlDebugListener接口，实现此接口的各个方法可以监控XQuery执行的每个过程。Debugging API的使用可以参考example/cxx/misc/debug.cpp或者后续文章。</p>
<h3>4. 用户自定义XQuery externl函数</h3>
<p>新增加的XmlExternalFunction类允许用户使用C++，Java或者Python实现XQuery的external函数( <a href="http://www.xquery.com/tutorials/guided-tour/external-functions-variables.html">什么是XQuery external 函数</a>)。用户只需要继承XmlExternalFunction，并实现execute()方法。 execute()方法中包括了用户需要实现函数的功能。具体例子请参考包含于发布包的example/cxx/misc/extrenalFunction.cpp, 或者这篇文章。</p>
<h3>5. XmlResults增强</h3>
<p>XmlResults类增加了三个方法，用来操作“离线”的XmlResults对象。<br />
a.XmlResults.asEventWriter(), 可以通过这个方法创建一个XmlEventWriter对象。 用这个XmlEventWriter对象可以向XmlResults中写入数据创建自己需要的XmlResults</p>
<p>b.XmlResults.copyResults(), 通过这个方法可以拷贝生成一个持久的XmlResults对象，不会因为container关闭而失效。<br />
c.XmlResults.concatResults()，通过这个方法可以把两个XmlResults对象连接起来形成一个新的XmlResults对象，当然返回的对象也和container的生命周期无关。<br />
具体的使用可以参考后续文章。</p>
<h3>6. Node存储模式增强</h3>
<p>改进了node储存的算法，使得在node储存的模式下XmlContainer的文件大小进一步减小。</p>
<h3>结束语</h3>
<p>Berkeley DB Xml 2.5版是一个更好更快的版本，本系列文章将会对前5个新特性一一通过例子说明，谢谢各位同学关注。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/09/berkeley-db-xml-25-%e6%96%b0%e7%89%b9%e6%80%a7%e8%af%a6%e8%a7%a3%e4%b8%80%ef%bc%9a-%e6%a6%82%e8%bf%b0/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Xml 入门系列之二： 在Linux下编译和使用Berkeley DB Xml</title>
		<link>http://www.bdbchina.com/2009/07/berkeley-db-xml-complie-on-linux/</link>
		<comments>http://www.bdbchina.com/2009/07/berkeley-db-xml-complie-on-linux/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 10:31:50 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[dbxml]]></category>
		<category><![CDATA[蔡瀛]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=379</guid>
		<description><![CDATA[在前面的文章《Berkeley DB Xml 入门系列之一： 简介与”query”示例程序详解》我们已经知道了Berkeley DB Xml程序的一些基本流程和概念。在文章《使用Visual C++ 2008 Express Edition 编译Oracle Berkeley DB XML》介绍了如何使用Visual Studio 在Windows平台上编译Berkeley DB Xml，本文将介绍在Linux或者类Unix的操作系统上如何编译和使用Berkeley DB Xml。

下载
可以在这个地址http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载最新的Berkeley DB Xml的 安装包，Linux下使用可以下载.tar.gz 或者.zip结尾的包。目前的最新版本是2.4.16， .tar.gz结尾的包的大小约为36M。我们下载.tar.gz 结尾的包作为本文的示例。
下载完后得到是这样一个文件
ying@bdbcn3:~t$ ls
dbxml-2.4.16.tar.gz
编译
解压缩
ying@bdbcn3:~$ tar zxvf dbxml-2.4.16.tar.gz
进入dbxml-2.4.16目录后可以看见有一个buildall.sh的脚本, 这个脚本就是用来编译dbxml的。可以使用&#8211;help选项查看编译选项。一些主要选项有：用 -x 指定c++ 编译器， -c指定 c编译器，要注意的是Berkeley DB Xml需要使用gnu的make程序进行编译，可以用-m 指定make程序。 我们在linux下编译的话这些选项基本不需要指定，默认即可。
ying@bdbcn3:~/dbxml-2.4.16$ ./buildall.sh &#8211;help
Usage: ./buildall.sh [options]
&#8211;help                                 print this help message
-p &#60;platform&#62;                         platform type as understood by
runConfigure [...]]]></description>
			<content:encoded><![CDATA[<p>在前面的文章<a title="《Berkeley DB Xml 入门系列之一： 简介与”query”示例程序详解》" href="http://www.bdbchina.com/2009/07/berkeley-db-xml-入门系列之一：-简介与query示例程序详解/" target="_blank">《Berkeley DB Xml 入门系列之一： 简介与”query”示例程序详解》</a>我们已经知道了Berkeley DB Xml程序的一些基本流程和概念。在文章<a href="http://www.bdbchina.com/2009/04/%E4%BD%BF%E7%94%A8visual-c-2008-express-edition-%E7%BC%96%E8%AF%91oracle-berkeley-db-xml/" target="_blank">《使用Visual C++ 2008 Express Edition 编译Oracle Berkeley DB XML》</a>介绍了如何使用Visual Studio 在Windows平台上编译Berkeley DB Xml，本文将介绍在Linux或者类Unix的操作系统上如何编译和使用Berkeley DB Xml。</p>
<p><span id="more-379"></span></p>
<h3>下载</h3>
<p>可以在这个地址http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载最新的Berkeley DB Xml的 安装包，Linux下使用可以下载.tar.gz 或者.zip结尾的包。目前的最新版本是2.4.16， .tar.gz结尾的包的大小约为36M。我们下载.tar.gz 结尾的包作为本文的示例。</p>
<p>下载完后得到是这样一个文件</p>
<blockquote><p>ying@bdbcn3:~t$ ls<br />
dbxml-2.4.16.tar.gz</p></blockquote>
<h3>编译</h3>
<p>解压缩</p>
<blockquote><p>ying@bdbcn3:~$ tar zxvf dbxml-2.4.16.tar.gz</p></blockquote>
<p>进入dbxml-2.4.16目录后可以看见有一个buildall.sh的脚本, 这个脚本就是用来编译dbxml的。可以使用&#8211;help选项查看编译选项。一些主要选项有：用 -x 指定c++ 编译器， -c指定 c编译器，要注意的是Berkeley DB Xml需要使用gnu的make程序进行编译，可以用-m 指定make程序。 我们在linux下编译的话这些选项基本不需要指定，默认即可。</p>
<blockquote><p>ying@bdbcn3:~/dbxml-2.4.16$ ./buildall.sh &#8211;help<br />
Usage: ./buildall.sh [options]<br />
&#8211;help                                 print this help message<br />
-p &lt;platform&gt;                         platform type as understood by<br />
runConfigure in Xerces-C++ [guessed]<br />
-c &lt;C compiler name&gt;                 [gcc]<br />
-x &lt;C++ compiler name&gt;               [g++]<br />
-m &lt;make command&gt;                  [make]<br />
-b &lt;bits to build: 32 or 64&gt;           [32]<br />
&#8211;no-configure:                       do not re-run configure steps.  Assumes<br />
configuration has been run previously<br />
&#8211;clean:                               perform &#8216;make clean&#8217; on all libraries<br />
&#8230;.</p></blockquote>
<p>在运行buildall.sh的时候如果不指定安装目录，则所有编译产生的库文件和头文件就会安装在主目录的install目录下。如果指定了安装目录， 请确保对目录有写权限。我们把&#8211;enable-java的选项打开，编译java库。</p>
<blockquote><p>ying@bdbcn3:~/dbxml-2.4.16$ ./buildall.sh &#8211;enable-java</p></blockquote>
<p>接着等待编译过程，一般酷睿2的机器十几分钟就编译完了。查看安装目录</p>
<blockquote><p>ying@bdbcn3:~t/dbxml-2.4.16$ cd install/<br />
ying@bdbcn3:~/dbxml-2.4.16/install$ ls<br />
bin  docs  include  lib</p></blockquote>
<p>我们所需要的库就安装在lib目录下，头文件在include目录下，docs目录下是文档，bin目录下放了一些Berkeley DB 和 Berkeley DB Xml的工具。</p>
<h3>编译C++ hello world程序</h3>
<p>我们可以编译dbxml/examples/cxx/basic/helloWorld.cpp示例程序，看我们编译的库是否正确。在用编译的时候需要指定-I 和-L选项</p>
<blockquote><p>ying@bdbcn3:~/dbxml-2.4.16$g++ helloWorld.cpp -I /home/ying/dbxml-2.4.16/install/include/ -L /home/ying/dbxml-2.4.16/install/lib/ -ldbxml -ldb_cxx -lxqilla -lxerces-c -o helloWorld</p></blockquote>
<p>运行的时候需要把库的位置加入到环境变量中</p>
<blockquote><p>ying@bdbcn3:~/dbxml-2.4.16$ export LD_LIBRARY_PATH=/home/ying/dbxml-2.4.16/install/lib/<br />
ying@bdbcn3:~/dbxml-2.4.16$ ./helloWorld<br />
Document name: doc<br />
Content: &lt;hello&gt;Hello World&lt;/hello&gt;<br />
ying@bdbcn3:~/dbxml-2.4.16$</p></blockquote>
<h3>在一些linux发行版中直接安装</h3>
<p>一些Linux发行版对Berkeley DB Xml已经进行了打包，可以直接安装使用非常方便。可以参考如下命令：</p>
<p>Feodra: sudo yum install dbxml<br />
Gentoo: sudo emerge dbxml</p>
<h3>总结</h3>
<p>使用buildall.sh脚本来编译Berkeley db xml方便快捷，如果读者在linux或unix系统下编译有什么问题欢迎和我交流。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/07/berkeley-db-xml-complie-on-linux/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Xml 入门系列之一： 简介与&#8221;query&#8221;示例程序详解</title>
		<link>http://www.bdbchina.com/2009/07/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%80%ef%bc%9a-%e7%ae%80%e4%bb%8b%e4%b8%8equery%e7%a4%ba%e4%be%8b%e7%a8%8b%e5%ba%8f%e8%af%a6%e8%a7%a3/</link>
		<comments>http://www.bdbchina.com/2009/07/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%80%ef%bc%9a-%e7%ae%80%e4%bb%8b%e4%b8%8equery%e7%a4%ba%e4%be%8b%e7%a8%8b%e5%ba%8f%e8%af%a6%e8%a7%a3/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 08:40:22 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[dbxml]]></category>
		<category><![CDATA[蔡瀛]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=374</guid>
		<description><![CDATA[Oracle Berkeley DB XML 是一个可嵌入的开源 XML 数据库(Embedded Native Xml Database)，可基于 XQuery 访问存储在容器中的文档，并对其内容进行索引。Oracle Berkeley DB XML 构建于 Oracle Berkeley DB 之上，并继承了其丰富的特性和属性(包括 环境，各个级别的事务，Replication等)。与Oracle Berkeley DB 一样，它通过应用程序运 行，无需人为管理。Oracle Berkeley DB XML 主要功能模块包括有文档分析器、XML索引 器以及 XQuery 引擎，实现了最快速、最高效的Xml数据检索。
本文是Berkeley DB Xml入门系列文章的第一篇，此系列将会详细介绍Berkeley DB Xml的 使用和编程，并探讨一些Berkeley DB Xml 编程中的高级内容，欢迎大家关注。在这篇文章里面我们通过一个最简单查询例子，介绍最基本Berkeley DB Xml的编程流程，并介绍 Berkeley DB Xml 中的一些基本概念。
本示例程序(example/cxx/basic/query.cpp)使用C++编写，相应的Java版本可在安装包的example/java/basic目录下找到。
/*
*
*******
*
* 这是一个最简单的Berkeley DB Xml程序，描述了如何进行查询和结果处理
*
* 这个程序展示了以下几个方面内容:
*  初始化Berkeley DB Xml
*  创建XmlContainer
*  插入Xml文档
*  [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle Berkeley DB XML 是一个可嵌入的开源 XML 数据库(Embedded Native Xml Database)，可基于 XQuery 访问存储在容器中的文档，并对其内容进行索引。Oracle Berkeley DB XML 构建于 Oracle Berkeley DB 之上，并继承了其丰富的特性和属性(包括 环境，各个级别的事务，Replication等)。与Oracle Berkeley DB 一样，它通过应用程序运 行，无需人为管理。Oracle Berkeley DB XML 主要功能模块包括有文档分析器、XML索引 器以及 XQuery 引擎，实现了最快速、最高效的Xml数据检索。</p>
<p>本文是Berkeley DB Xml入门系列文章的第一篇，此系列将会详细介绍Berkeley DB Xml的 使用和编程，并探讨一些Berkeley DB Xml 编程中的高级内容，欢迎大家关注。在这篇文章里面我们通过一个最简单查询例子，介绍最基本Berkeley DB Xml的编程流程，并介绍 Berkeley DB Xml 中的一些基本概念。<span id="more-374"></span></p>
<p>本示例程序(example/cxx/basic/query.cpp)使用C++编写，相应的Java版本可在安装包的example/java/basic目录下找到。</p>
<pre name="code" class="cpp:nogutter">/*
*
*******
*
* 这是一个最简单的Berkeley DB Xml程序，描述了如何进行查询和结果处理
*
* 这个程序展示了以下几个方面内容:
*  初始化Berkeley DB Xml
*  创建XmlContainer
*  插入Xml文档
*  创建XQuery查询和执行查询
*  在查询中如何使用变量
*  结果处理
*
*
*/

#include &lt;iostream&gt;
#include &lt;dbxml/DbXml.hpp&gt;

using namespace DbXml;

int
main(int argc, char **argv)
{
    // 定义XmlContainer的文件名
    std::string containerName = "people.dbxml";
    // 定义Xml文档内容
    std::string content = "&lt;people&gt;&lt;person&gt;&lt;name&gt;joe&lt;/name&gt;&lt;/person&gt;&lt;person&gt;&lt;name&gt;mary&lt;/name&gt;&lt;/person&gt;&lt;/people&gt;";
    // 定义Xml文档名字，每个存储于XmlContainer中的Xml文档必须有唯一的名字
    std::string docName = "people";

    // 定义XQuery查询语句，用来查询姓名等于某个值的person结点, 注意$name是一
    // 个XQuery变量，可以赋值
    std::string queryString =
        "collection('people.dbxml')/people/person[name=$name]";

    try {

        // 所有的BDB XML程序都需要一个XmlManager对象，XmlManager用于管
        // 理BDB XML的各种对象资源
        XmlManager mgr;

        // 检查同名Xml容器是否已经存在了，存在的话就删除
        if (mgr.existsContainer(containerName))
            mgr.removeContainer(containerName);

        // 用XmlManager创建一个XmlContainer. Berkeley DB Xml把所有的Xml
        // 数据，索引以及其他相关内容存储在XmlContainer中，XmlContainer
        // 在磁盘上的表现就是一个.dbxml结尾的文件，当然也可以以其他后缀
        // 作为文件名结尾。我们也可以使用已经创建好的XmlContainer。
        XmlContainer cont = mgr.createContainer(containerName);

        // 修改container需要创建一个XmlUpdateContext对象
        XmlUpdateContext uc = mgr.createUpdateContext();
        // 插入一个Xml文档，提供文档名文档内容，和一个XmlUpdateContext对象
        // 插入后Xml文档就会以Berkeley DB Xml的格式存储于XmlContainer中
        cont.putDocument(docName, content, uc);

        // 如果是查询则需要创建一个XmlQueryContext对象
        XmlQueryContext qc = mgr.createQueryContext();

        // 可以在XmlQueryContext对象中设置需要查询的变量值
        qc.setVariableValue("name", "mary");

        // 接着创建一个XmlQueryExpression对象，用来进行查询，用前面创
        // 建的XmlQueryContext对象做为参数
        XmlQueryExpression expr = mgr.prepare(queryString, qc);
        // 执行查询，返回XmlResults对象
        XmlResults res = expr.execute(qc);

        // 可以通过XmlQueryExpression::getQuery()方法获得XQuery查询语句
        // 通过XmlResults::size()方法可以知道查询的结果集大小
        std::cout &lt;&lt; "The query, '" &lt;&lt; expr.getQuery() &lt;&lt; "' returned " &lt;&lt;
            (unsigned int) res.size() &lt;&lt; " result(s)" &lt;&lt; std::endl;

        // 处理返回的XmlResults对象， 输出他们的值
        XmlValue value;
        std::cout &lt;&lt; "Result: " &lt;&lt; std::endl;
        while (res.next(value)) {
            std::cout &lt;&lt; "t" &lt;&lt; value.asString() &lt;&lt; std::endl;
        }

        //异常处理， Berkeley DB Xml的所有对象如果发生异常会抛出XmlException
        } catch (XmlException &amp;xe) {
            std::cout &lt;&lt; "XmlException: " &lt;&lt; xe.what() &lt;&lt; std::endl;
    }
    return 0;
}</pre>
<p>本程序的运行结果是：</p>
<pre>[ying@ying build_unix]$ ./query
The query, 'collection('people.dbxml')/people/person[name=$name]' returned 1 result(s)
Result:
&lt;person&gt;&lt;name&gt;mary&lt;/name&gt;&lt;/person&gt;</pre>
<h3>总结</h3>
<p>通过这个示例程序我们可以知道，Berkeley DB Xml的程序一般有一下几个步骤，创建XmlManager；创建或打开XmlContainer；创建XmlQueryExpression并执行查询；处理查询结果。读者可以尝试修改setc.setVariableValue(&#8220;name&#8221;, &#8220;mary&#8221;)这一句，看查询 结果是否有变化。更高级的Berkeley DB Xml程序可添加事务，环境(Berkeley DB 的Environment)等等功能, 读者可以关注本博客后续文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/07/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%80%ef%bc%9a-%e7%ae%80%e4%bb%8b%e4%b8%8equery%e7%a4%ba%e4%be%8b%e7%a8%8b%e5%ba%8f%e8%af%a6%e8%a7%a3/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>使用Visual C++ 2008 Express Edition 编译Oracle Berkeley DB XML</title>
		<link>http://www.bdbchina.com/2009/04/%e4%bd%bf%e7%94%a8visual-c-2008-express-edition-%e7%bc%96%e8%af%91oracle-berkeley-db-xml/</link>
		<comments>http://www.bdbchina.com/2009/04/%e4%bd%bf%e7%94%a8visual-c-2008-express-edition-%e7%bc%96%e8%af%91oracle-berkeley-db-xml/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 10:35:07 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Ying Cai]]></category>
		<category><![CDATA[dbxml]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=178</guid>
		<description><![CDATA[摘要：本文介绍了Oracle Berkeley DB XML, 并描述了使用Microsoft Visual C++ 2008 express edition 在Windows 平台编译Oracle Berkeley DB XML的过程。
关键字：Berkeley DB XML, Windows 平台编译

1.前言
Oracle Berkeley DB XML 是一个可嵌入的开源 Native XML 数据库，可基于 XQuery 访问存储在容器中的文档，并对其内容进行索引。Oracle Berkeley DB XML 构建于 Oracle Berkeley DB 之上，并继承了其丰富的特性和属性。与 Oracle Berkeley DB 一样，它通过应用程序运行，无需人为管理。Oracle Berkeley DB XML 在 Oracle Berkeley DB 之上新增了文档分析器、XML 索引器以及 XQuery 引擎，实现了最快速、最高效的数据检索。由于以 Berkeley DB 作为底层存储引擎，因此 Berkeley [...]]]></description>
			<content:encoded><![CDATA[<p>摘要：本文介绍了Oracle Berkeley DB XML, 并描述了使用Microsoft Visual C++ 2008 express edition 在Windows 平台编译Oracle Berkeley DB XML的过程。</p>
<p>关键字：Berkeley DB XML, Windows 平台编译</p>
<p><span id="more-178"></span></p>
<p>1.前言</p>
<p>Oracle Berkeley DB XML 是一个可嵌入的开源 Native XML 数据库，可基于 XQuery 访问存储在容器中的文档，并对其内容进行索引。Oracle Berkeley DB XML 构建于 Oracle Berkeley DB 之上，并继承了其丰富的特性和属性。与 Oracle Berkeley DB 一样，它通过应用程序运行，无需人为管理。Oracle Berkeley DB XML 在 Oracle Berkeley DB 之上新增了文档分析器、XML 索引器以及 XQuery 引擎，实现了最快速、最高效的数据检索。由于以 Berkeley DB 作为底层存储引擎，因此 Berkeley DB XML 继承了完整的 ACID 事务处理、自动恢复、热备份、用于分布式事务的 XA、通过 AES 进行磁盘数据加密以及针对高可用性的复制。此外，Berkeley DB XML 中还可存储 XML 和非 XML 数据，这将有利于某些应用程序的运行。目前，除了该数据库外，市场上还没有任何一款 XML 数据库是基于此种成熟、经过实测的技术。</p>
<p>微软推出的Visual Studio Express Edition 是轻型、易学、易用的开发工具，适用于业余爱好者、热衷者和学生， 可以免费使用。在编译器及编译环境上与Visual Studio正式版并无差异。</p>
<p>本文使用Visual C++ 2008 Express Edition 编译Oracle Berkeley DB XML 2.4.16 版本。</p>
<p>2. 下载Oracle Berkeley DB XML</p>
<p>Oracle Berkeley DB XML可从此处下载：<a title="http://www.oracle.com/technology/global/cn/software/products/berkeley-db/xml/index.html" href="http://www.oracle.com/technology/global/cn/software/products/berkeley-db/xml/index.html" target="_blank">http://www.oracle.com/technology/global/cn/software/products/berkeley-db/xml/index.html</a></p>
<p><img class="alignnone size-full wp-image-180" title="下载" src="http://www.bdbchina.com/wp-content/uploads/2009/04/1.png" alt="下载" width="380" height="245" /></p>
<p>点击Berkeley DB XML 2.4.16.zip, 因为本文是描述如何从源代码编译Berkeley DB XML, 所以我们不选择Windows 安装程序。下载zip包后解压。</p>
<p>3. 编译</p>
<p>解压后我们发现， zip包里面存在以下目录</p>
<p><img class="alignnone size-full wp-image-184" title="21" src="http://www.bdbchina.com/wp-content/uploads/2009/04/21.png" alt="21" width="318" height="179" /></p>
<p>打开dbxmlbuild_windows 目录， 可以看到有很多Visual Studio的解决方案和工程项目文件，包括VC6, VC7, VC8. 我们将使用VC8的solution file.</p>
<p><img class="alignnone size-full wp-image-185" title="3" src="http://www.bdbchina.com/wp-content/uploads/2009/04/3.png" alt="3" width="401" height="192" /></p>
<p>打开Visual C++ 2008 Express,  选择菜单-&gt;File-&gt;Open-&gt;Project/Solution, 打开build_windows目录下的BDBXML_all_vs8.sln文件.</p>
<p><img class="alignnone size-full wp-image-186" title="4" src="http://www.bdbchina.com/wp-content/uploads/2009/04/4.png" alt="4" width="406" height="171" /></p>
<p>在出现的转换向导直接点击Finish, 等待VS导入解决方案后，可以看到所有Berkeley DB XML的项目都载入到Visual Studio中，</p>
<p><img class="alignnone size-full wp-image-187" title="5" src="http://www.bdbchina.com/wp-content/uploads/2009/04/5.png" alt="5" width="276" height="391" /></p>
<p>右键点中dbxml项目，选择Build， 在点击Build前可以在工具栏选择编译的类型Debug/Release 和平台。</p>
<p><img class="alignnone size-full wp-image-189" title="61" src="http://www.bdbchina.com/wp-content/uploads/2009/04/61.png" alt="61" width="326" height="682" /></p>
<p>先喝杯茶放松放松，稍侯片刻。几分钟后Berkeley DB XML就已经编译完毕</p>
<p><img class="alignnone size-full wp-image-190" title="7" src="http://www.bdbchina.com/wp-content/uploads/2009/04/7.png" alt="7" width="458" height="110" /></p>
<p>编译完成打开DB XML目录可以看到增加了几个目录，在bin目录下包含的是Berkeley DB XML所使用的.dll 文件。</p>
<p><img class="alignnone size-full wp-image-192" title="8" src="http://www.bdbchina.com/wp-content/uploads/2009/04/8.png" alt="8" width="350" height="189" /></p>
<p>4. 总结</p>
<p>在Windows平台使用Visual C++ express版本编译Berkeley DB XML是比较容易的，读者如果在编译上有什么疑问欢迎和我交流，后续文章将会介绍更多的Oracle Berkeley DB XML的使用和优化。</p>
<p>&#8212;-</p>
<p>参考链接：</p>
<p><a title="http://www.oracle.com/technology/global/cn/software/products/berkeley-db/xml/index.html" href="http://www.oracle.com/technology/global/cn/software/products/berkeley-db/xml/index.html" target="_blank">http://www.oracle.com/technology/global/cn/software/products/berkeley-db/xml/index.html</a></p>
<p><a title="http://www.oracle.com/technology/global/cn/products/berkeley-db/xml/index.html" href="http://www.oracle.com/technology/global/cn/products/berkeley-db/xml/index.html" target="_blank">http://www.oracle.com/technology/global/cn/products/berkeley-db/xml/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/04/%e4%bd%bf%e7%94%a8visual-c-2008-express-edition-%e7%bc%96%e8%af%91oracle-berkeley-db-xml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
Դ