<?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/rucongzhao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Thu, 15 Dec 2011 10:35:52 +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 5.2 ADO.NET开发包介绍</title>
		<link>http://www.bdbchina.com/2011/07/berkeley-db-5-2-ado-net%e5%bc%80%e5%8f%91%e5%8c%85%e4%bb%8b%e7%bb%8d/</link>
		<comments>http://www.bdbchina.com/2011/07/berkeley-db-5-2-ado-net%e5%bc%80%e5%8f%91%e5%8c%85%e4%bb%8b%e7%bb%8d/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 06:19:03 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1566</guid>
		<description><![CDATA[Berkeley DB 5.2版本在六月份顺利发布了。在这一版本中，我负责完成了Berkeley DB SQL (以下简称DBSQL)的第一个独立的ADO.NET发布包。以下向大家介绍一下其基本用法。
ADO.NET是微软在.NET Framework中负责数据访问的类库集，它是使用在COM时代奠基的OLE DB技术以及.NET Framework的类库和编程语言来发展的，它可以让.NET上的任何编程语言能够连接并访问关系数据库与非数据库型数据源（例如XML，Excel或是文字档数据），或是独立出来作为处理应用程序数据的类对象，其在.NET Framework中的地位是举足轻重，许多人将ADO.NET视为ADO的下一个版本，但其实它是一个全新的架构、产品与概念。
DBSQL ADO.NET包是一个针对Windows ADO.NET用户发布的独立包，已包含DBSQL所需的源代码和文件。ADO.NET用户可直接用它来编译生成基于Berkeley DB引擎的ADO.NET库。
用户可在Oracle Berkeley DB的官方网站下载以下文件：

Berkeley DB dbsql-adodotnet-5.2.28.zip, for ADO.NET (12M)

下文将详细介绍在Windows和Windows Mobile环境下的编译使用过程：

1. 环境需求
如果你的环境没有满足以下要求，相对应的工程是无法编译通过的：

System.Data.SQLite.Linq 需要 .Net Framework 3.5 SP1.
SQLite.Designer需要Microsoft Visual Studio SDK.

如果你不需要以上两个组件，可忽略相应的系统需求。
2. Windows
以Windows XP 32bit Visual Studio 2008为例:
打开SQLite.NET.2008.sln，如果遇到对话框询问加载方式，选择“正常加载项目”。
选择编译方式为ReleaseNative, Win32

编译整个项目。

测试生成的库：右键选择test.2008, 调试，启动新实例。点击“Run”，运行整个测试集。这些内置的ADO.NET测试同时也是很好的范例。

3. Windows Mobile
以下仍以Windows XP 32bit Visual Studio 2008为例。首先，要安装Windows Mobile 6.5.3 DTK (Developer Tool Kit) 在这里下载。
打开SQLite.NET.2008.WinCE.sln，如果遇到对话框询问加载方式，选择“正常加载项目”
然后，在”Mixed Platforms”所在的下拉菜单中选择“配置管理器”，然后如下图所示新建一个平台：

编译选项选择ReleaseNativeOnly, 然后编译整个工程。
编译通过后，将SQLite.Interop.2008.WinCE布署到Windows Mobile仿真器上：
右键选择SQLite.Interop.2008.WinCE, [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB 5.2版本在六月份顺利发布了。在这一版本中，我负责完成了Berkeley DB SQL (以下简称DBSQL)的第一个独立的ADO.NET发布包。以下向大家介绍一下其基本用法。</p>
<p>ADO.NET是微软在.NET Framework中负责数据访问的类库集，它是使用在COM时代奠基的OLE DB技术以及.NET Framework的类库和编程语言来发展的，它可以让.NET上的任何编程语言能够连接并访问关系数据库与非数据库型数据源（例如XML，Excel或是文字档数据），或是独立出来作为处理应用程序数据的类对象，其在.NET Framework中的地位是举足轻重，许多人将ADO.NET视为ADO的下一个版本，但其实它是一个全新的架构、产品与概念。</p>
<p>DBSQL ADO.NET包是一个针对Windows ADO.NET用户发布的独立包，已包含DBSQL所需的源代码和文件。ADO.NET用户可直接用它来编译生成基于Berkeley DB引擎的ADO.NET库。</p>
<p>用户可在Oracle Berkeley DB的官方网站<a href="http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html">下载</a>以下文件：</p>
<ul>
<li>Berkeley DB dbsql-adodotnet-5.2.28.zip, for ADO.NET (12M)</li>
</ul>
<p>下文将详细介绍在Windows和Windows Mobile环境下的编译使用过程：<br />
<span id="more-1566"></span></p>
<h2>1. 环境需求</h2>
<p>如果你的环境没有满足以下要求，相对应的工程是无法编译通过的：</p>
<ul>
<li>System.Data.SQLite.Linq 需要 .Net Framework 3.5 SP1.</li>
<li>SQLite.Designer需要Microsoft Visual Studio SDK.</li>
</ul>
<p>如果你不需要以上两个组件，可忽略相应的系统需求。</p>
<h2>2. Windows</h2>
<p>以Windows XP 32bit Visual Studio 2008为例:</p>
<p>打开SQLite.NET.2008.sln，如果遇到对话框询问加载方式，选择“正常加载项目”。</p>
<p>选择编译方式为ReleaseNative, Win32<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_1.png"><img class="alignnone size-full wp-image-1567" title="dbsql_adodotnet_1" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_1.png" alt="" width="284" height="35" /></a></p>
<p>编译整个项目。<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_2.jpg"><img class="alignnone size-full wp-image-1568" title="dbsql_adodotnet_2" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_2.jpg" alt="" width="500" height="415" /></a></p>
<p>测试生成的库：右键选择test.2008, 调试，启动新实例。点击“Run”，运行整个测试集。这些内置的ADO.NET测试同时也是很好的范例。<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_3.png"><img class="alignnone size-full wp-image-1569" title="dbsql_adodotnet_3" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_3-300x258.png" alt="" width="400" height="344" /></a></p>
<h2>3. Windows Mobile</h2>
<p>以下仍以Windows XP 32bit Visual Studio 2008为例。首先，要安装Windows Mobile 6.5.3 DTK (Developer Tool Kit) 在<a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c0213f68-2e01-4e5c-a8b2-35e081dcf1ca&amp;displaylang=en">这里</a>下载。</p>
<p>打开SQLite.NET.2008.WinCE.sln，如果遇到对话框询问加载方式，选择“正常加载项目”</p>
<p>然后，在”Mixed Platforms”所在的下拉菜单中选择“配置管理器”，然后如下图所示新建一个平台：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_4.png"><img class="alignnone size-full wp-image-1572" title="dbsql_adodotnet_4" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_4.png" alt="" width="608" height="360" /></a></p>
<p><strong>编译选项选择ReleaseNativeOnly, 然后编译整个工程。</strong></p>
<p>编译通过后，将SQLite.Interop.2008.WinCE布署到Windows Mobile仿真器上：<br />
右键选择SQLite.Interop.2008.WinCE, 属性-&gt;部署-&gt;远程目录<br />
按需定义部署目录。这里为了方便演示下面的测试，将目录设定为：<br />
%CSIDL_PROGRAM_FILES%\testce</p>
<p>确定保存后，再次右键选择SQLite.Interop.2008.WinCE，选择部署。稍等一会后，当VisualStudio输出窗口显示以下内容，表明仿真器已经启动<br />
========== 部署: 成功1 个，失败0 个，跳过0 个==========<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_5.jpg"><img class="alignnone size-full wp-image-1573" title="dbsql_adodotnet_5" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_5.jpg" alt="" width="262" height="406" /></a></p>
<p>同样的部署System.Data.SQLite.Compact.2008, 按下图所示选择仿真器<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_6.jpg"><img class="alignnone size-full wp-image-1574" title="dbsql_adodotnet_6" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_6.jpg" alt="" width="367" height="222" /></a></p>
<p>右键选择testce.2008, 调试，启动新实例。如上图选择仿真器。测试集会自动运行，这些内置的ADO.NET测试同时也是很好的范例。运行结果如下所示(在仿真器中可用方向键对结果翻页)：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_7.jpg"><img class="alignnone size-full wp-image-1575" title="dbsql_adodotnet_7" src="http://www.bdbchina.com/wp-content/uploads/2011/06/dbsql_adodotnet_7.jpg" alt="" width="262" height="406" /></a></p>
<h2>4. 结束语</h2>
<p>以上介绍了DBSQL ADO.NET发布包的编译使用过程。你可以在发布包的根目录下找到具体的官方文档。如果在使用过程中有任何问题，欢迎和我交流！</p>
<p>BDB Blog：<a href="http://www.bdbchina.com/">http://www.bdbchina.com/</a><br />
BDB微博：<a href="http://weibo.com/bdbchina">http://weibo.com/bdbchina</a><br />
个人微博：<a href="http://weibo.com/2153755234">http://weibo.com/2153755234</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2011/07/berkeley-db-5-2-ado-net%e5%bc%80%e5%8f%91%e5%8c%85%e4%bb%8b%e7%bb%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB 5.2 Android平台编译过程介绍</title>
		<link>http://www.bdbchina.com/2011/07/berkeley-db-5-2-android%e5%b9%b3%e5%8f%b0%e7%bc%96%e8%af%91%e8%bf%87%e7%a8%8b%e4%bb%8b%e7%bb%8d/</link>
		<comments>http://www.bdbchina.com/2011/07/berkeley-db-5-2-android%e5%b9%b3%e5%8f%b0%e7%bc%96%e8%af%91%e8%bf%87%e7%a8%8b%e4%bb%8b%e7%bb%8d/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 06:19:00 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[Drop-in]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1584</guid>
		<description><![CDATA[在Berkeley DB 5.2版本中，Android Drop-in编译方式正式纳入官方发布文档。5.2的Android编译过程和先前我基于DBSQL 5.0写的博文稍有不同。以下介绍Oracle Berkeley DB 5.2官方文档中Android安装文档。欢迎交流。
Android默认提供的数据库功能是SQLite。Berkeley DBSQL完全兼容SQLite API，可以直接替换SQLite库而无需改动现有的应用程序或服务。依本方法编译得到的Berkeley DBSQL库将完全替换Android的SQLite库(drop-in模式)。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到Berkeley DBSQL库以获取更高的存储和并发性能。
完整原文：http://download.oracle.com/docs/cd/E17076_02/html/installation/build_android_intro.html
中文介绍：

Android编译过程
本节提供了Berkeley DB Drop-in方式的Android编译指令。
首先要下载并且编译Android源代码树。
第一次编译过程需要花费较长一段时间，不过后面再编译就快多了。可以从这里下载Android的源代码并且按照Android文档完成编译过程。
把Berkeley DB代码目录拷到Android的代码目录里面：

$ cd ${root}/external/sqlite/dist
$ tar zxvf db-xx.tar.gz

这里的${root}指的是Android源代码树的根路径。
通过以下命令将源代码树中默认的Android.mk文件替换成Berkeley DB的版本：

$ cd ${root}/external/sqlite/dist
$ mv Android.mk Android.mk.sqlite
$ cp db-xx/build_android/Android.mk ./

提示：编译之前，可通过这里查看Android平台上的几种调优参数。
重新编译数据库部分，这样Berkeley DB就替换到最终生成的系统镜像了：

$ cd ${root}
$ . build/envsetup.sh
$ make clean-libsqlite
$ mmm -B external/sqlite/dist
$ make snod

以上指令完成后，新的基于Berkeley DB SQL的Android系统镜像即编译完毕。系统会打印出新的镜像所在目录，一般来说这个目录是：${root}/out/target/product/generic。 
从SQLite迁移到Berkeley DB
如果你需要使DBSQL能够自动打开并转换现有的SQLite数据库文件，请参照本节的步骤。
首先，我们需要通过以下脚本来为Android平台编译一个静态的SQLite shell, 这个shell对自动转换功能而言是必需的。

#!/bin/bash
# This script shows how to use built-in toolchain [...]]]></description>
			<content:encoded><![CDATA[<p>在Berkeley DB 5.2版本中，Android Drop-in编译方式正式纳入官方发布文档。5.2的Android编译过程和先前我基于DBSQL 5.0写的<a href="http://www.bdbchina.com/2010/04/%E5%9C%A8android%E5%B9%B3%E5%8F%B0%E4%B8%8A%E5%BA%94%E7%94%A8berkeley-db-11gr2-sqldrop-in%E6%A8%A1%E5%BC%8F/">博文</a>稍有不同。以下介绍Oracle Berkeley DB 5.2官方文档中Android安装文档。欢迎交流。</p>
<p>Android默认提供的数据库功能是SQLite。Berkeley DBSQL完全兼容SQLite API，可以直接替换SQLite库而无需改动现有的应用程序或服务。依本方法编译得到的Berkeley DBSQL库将完全替换Android的SQLite库(drop-in模式)。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到Berkeley DBSQL库以获取<a href="http://www.bdbchina.com/2010/03/%E6%9B%B4%E5%A4%9A%E5%85%B3%E4%BA%8Eoracle-berkeley-db-sql%E7%9A%84%E6%8A%A5%E9%81%93/">更高的存储和并发性能</a>。</p>
<p>完整原文：http://download.oracle.com/docs/cd/E17076_02/html/installation/build_android_intro.html</p>
<p>中文介绍：<br />
<span id="more-1584"></span></p>
<h2>Android编译过程</h2>
<p>本节提供了Berkeley DB Drop-in方式的Android编译指令。</p>
<p>首先要下载并且编译Android源代码树。<br />
第一次编译过程需要花费较长一段时间，不过后面再编译就快多了。可以从<a href="http://source.android.com/source/download.html">这里</a>下载Android的源代码并且按照Android文档完成编译过程。</p>
<p>把Berkeley DB代码目录拷到Android的代码目录里面：</p>
<pre name="code" class="java:nogutter">
$ cd ${root}/external/sqlite/dist
$ tar zxvf db-xx.tar.gz
</pre>
<p>这里的${root}指的是Android源代码树的根路径。</p>
<p>通过以下命令将源代码树中默认的Android.mk文件替换成Berkeley DB的版本：</p>
<pre name="code" class="java:nogutter">
$ cd ${root}/external/sqlite/dist
$ mv Android.mk Android.mk.sqlite
$ cp db-xx/build_android/Android.mk ./
</pre>
<p>提示：编译之前，可通过<a href="http://download.oracle.com/docs/cd/E17076_02/html/installation/build_android_config.html">这里</a>查看Android平台上的几种调优参数。</p>
<p>重新编译数据库部分，这样Berkeley DB就替换到最终生成的系统镜像了：</p>
<pre name="code" class="java:nogutter">
$ cd ${root}
$ . build/envsetup.sh
$ make clean-libsqlite
$ mmm -B external/sqlite/dist
$ make snod
</pre>
<p>以上指令完成后，新的基于Berkeley DB SQL的Android系统镜像即编译完毕。系统会打印出新的镜像所在目录，一般来说这个目录是：${root}/out/target/product/generic。 </p>
<h2>从SQLite迁移到Berkeley DB</h2>
<p>如果你需要使DBSQL能够自动打开并转换现有的SQLite数据库文件，请参照本节的步骤。</p>
<p>首先，我们需要通过以下脚本来为Android平台编译一个静态的SQLite shell, 这个shell对自动转换功能而言是必需的。</p>
<pre name="code" class="java:nogutter">
#!/bin/bash
# This script shows how to use built-in toolchain to build
# sqlite3 shell, which is required by Berkeley DB SQL
# on-the-fly migration feature.

# Note: these variables should be set per active Android source tree
# We assume $PWD=$ROOT/external/sqlite/dist
ROOT=${PWD}/../../..
TOOLCHAIN=${ROOT}/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0
CC=${TOOLCHAIN}/bin/arm-eabi-gcc
LIB="${ROOT}/out/target/product/generic/obj/lib"
INCLUDE="${ROOT}/ndk/build/platforms/android-8/arch-arm/usr/include"

# CFLAGS should be set per Android.mk.sqlite (the original
# version of SQLite's Android.mk)
CFLAGS="-DHAVE_USLEEP=1 -DSQLITE_THREADSAFE=1 -DNDEBUG=1 \
 -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 \
 -DSQLITE_DEFAULT_AUTOVACUUM=1 \
 -DSQLITE_TEMP_STORE=3 -DSQLITE_ENABLE_FTS3 \
 -DSQLITE_ENABLE_FTS3_BACKWARDS -DTHREADSAFE=1"
CFLAGS="${CFLAGS} -I${INCLUDE}"

LDFLAGS="-ldl -nostdlib -Wl,--gc-sections -lc -llog -lgcc \
 -Wl,--no-undefined,-z,nocopyreloc ${LIB}/crtend_android.o \
 ${LIB}/crtbegin_dynamic.o -L${LIB} -Wl,-rpath,${LIB}"

${CC} -DANDROID -DOS_ANDROID --sysroot="${SYSROOT}" -mandroid \
      -fvisibility=hidden -ffunction-sections -fdata-sections \
      -fPIC ${LDFLAGS} ${CFLAGS} \
      sqlite3.c shell.c -o sqlite3orig
</pre>
<p>提示：你可能需要根据当前环境来修改以上环境变量。</p>
<p>运行以上脚本，成功的话我们就得到了一个静态的sqlite3 shell工具 &#8211; sqlite3orig</p>
<p>接下来我们需要修改系统image文件。首先用xyaffs2工具解压镜像文件</p>
<pre name="code" class="java:nogutter">$ xyaffs2 ./system.img system</pre>
<p>把编译好的sqlite3工具拷进去。</p>
<pre name="code" class="java:nogutter">
$ cp ${root}/external/sqlite/dist/sqlite3orig system/xbin/sqlite3orig
</pre>
<p>使用mkyaffs2image工具来重新生成system.img.</p>
<pre name="code" class="java:nogutter">
$ mkyaffs2image -f $PWD/system system.img
</pre>
<p>这样，修改好的系统镜像即可自动转换并打开现成的SQLite3数据库文件。需要注意的是：在adb shell模式下，打开sqlite3数据库的命令是sqlite3orig；而打开Berkeley DBSQL数据库的命令是sqlite3。</p>
<h2>结束语</h2>
<p>以上介绍了DBSQL Android平台上Drop-in模式的编译使用过程。如果你在使用过程中有任何问题，欢迎和我交流！</p>
<p>BDB Blog：<a href="http://www.bdbchina.com">http://www.bdbchina.com</a><br />
BDB微博：<a href="http://weibo.com/bdbchina">http://weibo.com/bdbchina</a><br />
个人微博：<a href="http://weibo.com/2153755234">http://weibo.com/2153755234</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2011/07/berkeley-db-5-2-android%e5%b9%b3%e5%8f%b0%e7%bc%96%e8%af%91%e8%bf%87%e7%a8%8b%e4%bb%8b%e7%bb%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB SQL 5.2新Vacuum功能简介</title>
		<link>http://www.bdbchina.com/2011/07/berkeley-db-sql-5-2%e6%96%b0vacuum%e5%8a%9f%e8%83%bd%e7%ae%80%e4%bb%8b/</link>
		<comments>http://www.bdbchina.com/2011/07/berkeley-db-sql-5-2%e6%96%b0vacuum%e5%8a%9f%e8%83%bd%e7%ae%80%e4%bb%8b/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 02:06:51 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[Vacuum]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1552</guid>
		<description><![CDATA[Berkeley DB 5.2版本在六月份顺利发布了。在这一版本中，我负责设计实现了Berkeley DB SQL的新Vacuum功能：增量Vacuum和Fill Percent参数。以下向大家介绍一下这些Vacuum功能的用法。
1. 什么是Vacuum
一个数据库在进行多次写操作(增,删,改)后，就会攒下一些碎片，即填充率非常低的页面(page)或是空白页面。这些页面占用了不少空间，却仅存储了少量数据。Vacuum的作用好比Windows下的磁盘碎片整理，即依次扫描数据库的数据页面，将数据搬移得更加紧凑，腾出空白页并且删除之，缩减数据库大小。Berkeley DB SQL(以下简称DBSQL)支持在线Vacuum(对一个正在运行的数据库进行操作)。你可以把它想像成扫描重排页面数据的写进程，这个进程可以和其它的所有OLDP操作并行执行。
在使用Vacuum时需要清楚以下要点：
- 整理数据碎片，回收文件系统空间，提升查询性能。
- 频繁操作会影响当前主业务性能。因此在DBSQL 5.2版本中，针对这一问题实现了增量Vacuum。用户可手动控制Vacuum操作涉及的数据块大小。
- 如果数据库被压得过紧，空闲空间不足，那么插入新数据时数据库需要频繁分配新页面，影响了操作性能。因此在DBSQL 5.2版本中，针对这一问题引入了Fill Percent参数。用户可手动控制Vacuum时的页面填充率。
以下具体介绍Berkeley DB SQL (以下简称DBSQL) 5.2版本中Vacuum功能的使用方法：

2. 使用Vacuum功能
2.1 基本Vacuum命令
基本的Vacuum命令是对全数据库进行Vacuum。直接在SQL语句或者SHELL里面执行&#8221;VACUUM&#8221;指令，即完成一次基本Vacuum：

VACUUM;

当数据库较大时，一次Vacuum将会耗费较多的时间，影响数据库的正常业务响应时间。此外，全数据库Vacuum是放在一个事务里面完成的，在资源受限的情况下，有可能无法一次完成对整个数据库的操作。
2.2 增量Vacuum
BDB 5.2实现了增量Vacuum。所谓增量，即每次Vacuum仅操作一小部分数据块，下一次再从上次结束的地方继续操作，如此反复进行，就可以完成整个数据库的Vacuum，同时也不会对主业务有明显影响。比如说 在一天中操作频率较低的时间段(夜间)，可以启动一个并行的维护程序，在数据库业务正常运行的同时，周期性地调用增量Vaccum来回收空间。
要使用增量Vacuum，需要先设定每次操作回收的最大页数(默认值为128页)。命令为：

PRAGMA bdbsql_vacuum_pages [=N]

此参数用于获得或者设定一次增量Vacuum操作的最大回收页数。当回收的页数大于该值时候，当前增量Vacuum完成并退出。如果未设定N，返回当前的最大回收页数。
设定了该参数后，我们有两种方式来使用增量Vacuum:

1. 手动
这种方式可以自由地控制Vacuum的频率和时机，也是推荐的方法。使用办法：首先调用&#8221;PRAGMA auto_vacuum=INCREMENTAL&#8221;来置为手动增量Vacuum模式，然后在程序中即可调用&#8221;PRAGMA incremental_vacuum(N)&#8221;来执行一次增量vacuum。
2. 自动
在自动模式下，DBSQL在提交事务后会自动执行一次增量Vacuum。这种方式的好处是不需要额外的程序控制，但如果事务提交非常频繁，会带来额外的负担。使用办法：调用&#8221;PRAGMA auto_vacuum=FULL&#8221;来设置数据库为自动增量Vacuum模式。

在数据库运行过程中，可用以上指令在手动和自动模式间切换。
2.3 Fill Percent
在DBSQL 5.2中我们引入了一个新的Vacuum参数：页面填充率。用法:

PRAGMA bdbsql_vacuum_fillpercent [=N]

此参数用于获得或者设置预期的数据库页面填充率。所有DBSQL Vacuum模式均受此参数控制。N为填充率百分比(1~100)，当N被设定时，DBSQL Vacuum会以N为目标重排数据库页。当N未被设定时，返回当前设定的页填充率(默认值为85).
Vacuum操作包括两方面：

1. 数据页重排
只有当页填充率百分比低于N时，DBSQL才会重排该页，将其它页面的数据挪到未使用的空间，使其填充率尽可能地接近目标值。被搬空的页面就成了新的空白页。
2. 空白页回收
统一将空白页挪到文件末端，删除空白页并截短数据库文件。


Fill Percent参数的引入，丰富了用户Vacuum操作的手段。在不同情况下用户可以选择不同的Fill Percent参数来精细化操作。典型的应用:

对于一个正在工作的数据库，用一个非常低的Fill Percent值(比如1)来快速回收数据库中已存在的空页。因为这种情况下不存在页内数据搬移，数据库仅仅将现有的空页交换到尾部并截短，不会对现有数据加锁，速度会非常快。
对于一个处于关闭状态的数据库，用一个较高的Fill Percent值来尽可能地回收空间。

这里有一个问题：假设用户设定目标Fill Percent值为80(%)，每条数据约占15%的空间。那么重排后该页应该存储5条数据(75%，更接近于目标值)还是6条数据(90%，更大填充率)呢。这是一个设计上的权衡选择。关于这一点，我们经过内部讨论后选择了前者。即令填充率接近于目标值，而不是尽可能地大。&#8221;Some applications want room to add data on the page, others [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB 5.2版本在六月份顺利发布了。在这一版本中，我负责设计实现了Berkeley DB SQL的新Vacuum功能：增量Vacuum和Fill Percent参数。以下向大家介绍一下这些Vacuum功能的用法。</p>
<h2>1. 什么是Vacuum</h2>
<p>一个数据库在进行多次写操作(增,删,改)后，就会攒下一些碎片，即填充率非常低的页面(page)或是空白页面。这些页面占用了不少空间，却仅存储了少量数据。Vacuum的作用好比Windows下的磁盘碎片整理，即依次扫描数据库的数据页面，将数据搬移得更加紧凑，腾出空白页并且删除之，缩减数据库大小。Berkeley DB SQL(以下简称DBSQL)支持在线Vacuum(对一个正在运行的数据库进行操作)。你可以把它想像成扫描重排页面数据的写进程，这个进程可以和其它的所有OLDP操作并行执行。</p>
<p><strong>在使用Vacuum时需要清楚以下要点：</strong><br />
- 整理数据碎片，回收文件系统空间，提升查询性能。<br />
- 频繁操作会影响当前主业务性能。因此在DBSQL 5.2版本中，针对这一问题实现了增量Vacuum。用户可手动控制Vacuum操作涉及的数据块大小。<br />
- 如果数据库被压得过紧，空闲空间不足，那么插入新数据时数据库需要频繁分配新页面，影响了操作性能。因此在DBSQL 5.2版本中，针对这一问题引入了Fill Percent参数。用户可手动控制Vacuum时的页面填充率。</p>
<p>以下具体介绍Berkeley DB SQL (以下简称DBSQL) 5.2版本中Vacuum功能的使用方法：<br />
<span id="more-1552"></span></p>
<h2>2. 使用Vacuum功能</h2>
<p><strong>2.1 基本Vacuum命令</strong><br />
基本的Vacuum命令是对全数据库进行Vacuum。直接在SQL语句或者SHELL里面执行&#8221;VACUUM&#8221;指令，即完成一次基本Vacuum：</p>
<ul>
<li><code>VACUUM;</code></li>
</ul>
<p>当数据库较大时，一次Vacuum将会耗费较多的时间，影响数据库的正常业务响应时间。此外，全数据库Vacuum是放在一个事务里面完成的，在资源受限的情况下，有可能无法一次完成对整个数据库的操作。</p>
<p><strong>2.2 增量Vacuum</strong><br />
BDB 5.2实现了增量Vacuum。所谓增量，即每次Vacuum仅操作一小部分数据块，下一次再从上次结束的地方继续操作，如此反复进行，就可以完成整个数据库的Vacuum，同时也不会对主业务有明显影响。比如说 在一天中操作频率较低的时间段(夜间)，可以启动一个并行的维护程序，在数据库业务正常运行的同时，周期性地调用增量Vaccum来回收空间。</p>
<p>要使用增量Vacuum，需要先设定每次操作回收的最大页数(默认值为128页)。命令为：</p>
<ul>
<li><code>PRAGMA bdbsql_vacuum_pages [=N]</code></li>
</ul>
<p>此参数用于获得或者设定一次增量Vacuum操作的最大回收页数。当回收的页数大于该值时候，当前增量Vacuum完成并退出。如果未设定N，返回当前的最大回收页数。</p>
<p>设定了该参数后，我们有两种方式来使用增量Vacuum:</p>
<ul>
<li><strong>1. 手动</strong><br />
这种方式可以自由地控制Vacuum的频率和时机，也是推荐的方法。使用办法：首先调用&#8221;PRAGMA auto_vacuum=INCREMENTAL&#8221;来置为手动增量Vacuum模式，然后在程序中即可调用&#8221;PRAGMA incremental_vacuum(N)&#8221;来执行一次增量vacuum。</li>
<li><strong>2. 自动</strong><br />
在自动模式下，DBSQL在提交事务后会自动执行一次增量Vacuum。这种方式的好处是不需要额外的程序控制，但如果事务提交非常频繁，会带来额外的负担。使用办法：调用&#8221;PRAGMA auto_vacuum=FULL&#8221;来设置数据库为自动增量Vacuum模式。</li>
</ul>
<p>在数据库运行过程中，可用以上指令在手动和自动模式间切换。</p>
<p><strong>2.3 Fill Percent</strong><br />
在DBSQL 5.2中我们引入了一个新的Vacuum参数：页面填充率。用法:</p>
<ul>
<li>PRAGMA bdbsql_vacuum_fillpercent [=N]</li>
</ul>
<p>此参数用于获得或者设置预期的数据库页面填充率。所有DBSQL Vacuum模式均受此参数控制。N为填充率百分比(1~100)，当N被设定时，DBSQL Vacuum会以N为目标重排数据库页。当N未被设定时，返回当前设定的页填充率(默认值为85).</p>
<p>Vacuum操作包括两方面：</p>
<ul>
<li><strong>1. 数据页重排</strong><br />
只有当页填充率百分比低于N时，DBSQL才会重排该页，将其它页面的数据挪到未使用的空间，使其填充率尽可能地接近目标值。被搬空的页面就成了新的空白页。</li>
<li><strong>2. 空白页回收</strong><br />
统一将空白页挪到文件末端，删除空白页并截短数据库文件。
</li>
</ul>
<p>Fill Percent参数的引入，丰富了用户Vacuum操作的手段。在不同情况下用户可以选择不同的Fill Percent参数来精细化操作。典型的应用:</p>
<ul>
<li>对于一个正在工作的数据库，用一个非常低的Fill Percent值(比如1)来快速回收数据库中已存在的空页。因为这种情况下不存在页内数据搬移，数据库仅仅将现有的空页交换到尾部并截短，不会对现有数据加锁，速度会非常快。</li>
<li>对于一个处于关闭状态的数据库，用一个较高的Fill Percent值来尽可能地回收空间。</li>
</ul>
<p>这里有一个问题：假设用户设定目标Fill Percent值为80(%)，每条数据约占15%的空间。那么重排后该页应该存储5条数据(75%，更接近于目标值)还是6条数据(90%，更大填充率)呢。这是一个设计上的权衡选择。关于这一点，我们经过内部讨论后选择了前者。即令填充率接近于目标值，而不是尽可能地大。&#8221;Some applications want room to add data on the page, others want the pages packed as densely as possible&#8221;。在BDB开发者看来，页里面的数据和空闲空间都是重要的。合理的空闲空间可以让新数据利用现有的空闲空间，使得数据插入更加快速。</p>
<h2>4. 范例</h2>
<p>以下面是新Vacuum功能的范例片段，该程序实现了对指定数据库的循环增量Vaccum。</p>
<pre name="code" class="java:nogutter">
void vacuum()
{
	sqlite3 *db;
	char sql[4096];
	struct timeval t1, t2, t_begin;
	int rc, i;

	sqlite3_open(db_name, &#038;db);
	error_handler(db);

	/* 设置为手动增量Vacuum模式 */
	exec_sql(db, "PRAGMA auto_vacuum=INCREMENTAL;", 1);

	/* 每次增量Vacuum最多回收256页 */
	exec_sql(db, "PRAGMA bdbsql_vacuum_pages=256;", 1);

	/*目标页填充率为75% */
	exec_sql(db, "PRAGMA bdbsql_vacuum_fillpercent=75;", 1);

	/*循环做40次增量Vacuum */
	for (i = 0; i < 40; i++) {
		exec_sql(db, "PRAGMA incremental_vacuum;", 1);
		if (rc = sqlite3_errcode(db)) {
			fprintf(stderr, "[vacuum] ERROR: %s. ERRCODE: %d.n",
				sqlite3_errmsg(db), rc);
		}

		/* 获得数据库文件大小 */
		get_filesize(db_name);

		/* 睡眠一小段时间以减轻Vacuum对数据库的IO压力 */
		sqlite3_sleep(100);
	}

	cleanup(db);
}
</pre>
<h2>5. 结束语</h2>
<p>以上我们介绍了5.2 Vacuum的新功能并给出了一个范例。欢迎继续关注!</p>
<p>官方资料：<a href="http://download.oracle.com/docs/cd/E17076_02/html/bdb-sql/changedpragmas.html#auto_vacuum">Auto Vacuum</a>, <a href="http://download.oracle.com/docs/cd/E17076_02/html/bdb-sql/changedpragmas.html#incremental_vacuum">Incremental Vacuum</a>, <a href="http://download.oracle.com/docs/cd/E17076_02/html/bdb-sql/addedpragmas.html#bdbsql_vacuum_fillpercent">Vacuum Fillpercent</a>, <a href="http://download.oracle.com/docs/cd/E17076_02/html/bdb-sql/addedpragmas.html#bdbsql_vacuum_pages">Vacuum pages</a></p>
<p>BDB Blog：<a href="http://www.bdbchina.com">www.bdbchina.com</a><br />
BDB微博：<a href="http://weibo.com/bdbchina">http://weibo.com/bdbchina</a><br />
个人微博：<a href="http://weibo.com/2153755234">http://weibo.com/2153755234</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2011/07/berkeley-db-sql-5-2%e6%96%b0vacuum%e5%8a%9f%e8%83%bd%e7%ae%80%e4%bb%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在UNIX环境下使用DBSQL作为FireFox/SQLite Manager的底层存储引擎</title>
		<link>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/</link>
		<comments>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 21:59:15 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1305</guid>
		<description><![CDATA[本文介绍如何在UNIX/Linux环境下将FireFox/SQLite Manager的底层存储引擎由SQLite转换为DBSQL.本博客介绍的过程同样也可推及到Google Chrome等使用SQLite作为存储引擎的优秀开源软件.
本文假定您已经根据在unixlinux平台上应用berkeley db 11gr2sql成功编译了DBSQL.
最后,需要特别强调的是,在做存储引擎转换和数据迁移前,必须做好用户数据的备份,以防操作不慎或其它意外造成的数据损坏.

 Firefox 3.6 on Linux 
Firefox distributions do not link to external/system sqlite3 lib. So we have to rebuild firefox from source code to force it to link system sqlite3 by &#8220;&#8211;enable-system-sqlite&#8221;
 1. Install sqlite-3.6.22 
We need original sqlite3 because we have to migrate existing database.
Download http://www.sqlite.org/sqlite-3.6.22.tar.gz

tar zxf sqlite-3.6.22.tar.gz
env CFLAGS="-DSQLITE_SECURE_DELETE=1" ./configure [...]]]></description>
			<content:encoded><![CDATA[<p>本文介绍如何在UNIX/Linux环境下将FireFox/SQLite Manager的底层存储引擎由SQLite转换为DBSQL.本博客介绍的过程同样也可推及到Google Chrome等使用SQLite作为存储引擎的优秀开源软件.</p>
<p>本文假定您已经根据<a href="http://www.bdbchina.com/2010/04/在unixlinux平台上应用berkeley-db-11gr2-sql/">在unixlinux平台上应用berkeley db 11gr2sql</a>成功编译了DBSQL.</p>
<p>最后,需要特别强调的是,在做存储引擎转换和数据迁移前,必须做好用户数据的备份,以防操作不慎或其它意外造成的数据损坏.</p>
<p><span id="more-1305"></span></p>
<h2> Firefox 3.6 on Linux </h2>
<p>Firefox distributions do not link to external/system sqlite3 lib. So we have to rebuild firefox from source code to force it to link system sqlite3 by &#8220;&#8211;enable-system-sqlite&#8221;</p>
<p><strong> 1. Install sqlite-3.6.22 </strong><br />
We need original sqlite3 because we have to migrate existing database.</p>
<p>Download http://www.sqlite.org/sqlite-3.6.22.tar.gz</p>
<pre>
tar zxf sqlite-3.6.22.tar.gz
env CFLAGS="-DSQLITE_SECURE_DELETE=1" ./configure --prefix=/usr
make
sudo make install
</pre>
<p><strong> 2. Build Firefox 3.6 </strong><br />
<strong>Note:This step may replace your system Firefox. Please backup your ~/.mozilla at first.</strong><br />
Get source code</p>
<pre>
mkdir $HOME/src/firefox-3.6
hg clone http://hg.mozilla.org/mozilla-central/ src
cd $HOME/src/firefox-3.6
</pre>
<p>Create a file &#8220;mozconfig&#8221; in current directory. Content of file &#8220;mozconfig&#8221;:</p>
<pre>
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-ff-release
ac_add_options --enable-system-sqlite
ac_add_options --disable-ogg
ac_add_options --disable-wave
ac_add_options --disable-crashreporter
ac_add_options --disable-necko-wifi
</pre>
<p>Build</p>
<pre>
make -f client.mk
sudo make -f client.mk install
</pre>
<p><strong> 3. Buid BDB SQL </strong><br />
Place up-to-date db source code on $HOME/hg/db_x86</p>
<pre>
cd $HOME/hg/db_x86/build_unix
env CFLAGS="-O3" ../dist/configure --enable-sql_compat --enable-sql
make dbsql &#038;&#038; make install
</pre>
<p><strong> 4. Modify Firefox linking </strong></p>
<pre>
cd /usr/local/lib/firefox-3.7a2pre
sudo ln -sf $HOME/install/lib/libdb_sql-5.0.so libsqlite3.so.0
</pre>
<p><strong> 5. Data Migration </strong><br />
(The directory name on my computer is &#8220;yezkdh8w.default&#8221;. It may be different in your platform)<br />
Here is an example for data migration. Here we just take downloads.sqlite as example. You may need to go through all *.sqlite files:</p>
<pre>
cd ~/.mozilla/firefox/
cp yezkdh8w.default yezkdh8w.default.bak -r # backup
cd yezkdh8w.default
bash ../firefox_convert.sh /usr/bin/sqlite3 /home/rucong/install/bin/dbsql
$ sqlite3 downloads.sqlite
SQLite version 3.6.22
Enter ".help" for instructions
sqlite> .echo ON
sqlite> .output dump
.output dump
sqlite> .dump
.dump
sqlite> .quit
.quit
$ mv downloads.sqlite downloads.sqlite.bak
$ ~/hg/db_x86/build_unix/dbsql downloads.sqlite
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .read dump
dbsql> .quit
$ rm dump
</pre>
<p><strong> 6. End </strong><br />
That&#8217;s all. Execute the new Firefox to see how it works.</p>
<hr/>
<h2> SQLite Manager </h2>
<p><strong> 1. Install SQLite Manager </strong><br />
Use above Firefox to visit <a href="https://addons.mozilla.org/en-US/firefox/addon/5817">SQLite Manager Plugin</a> and install it.<br />
Restart Firefox. We can start SQLite Manager by Menu->Tools->SQLite Manager now.</p>
<p><strong> 2. Open a BDB SQL Database </strong></p>
<p><strong>Generate database</strong><br />
Note: The version of BDB SQL has to be the same as the one we applied in Firefox.</p>
<pre>
cd db/build_unix
make ex_sql_binding
./ex_sql_binding
</pre>
<p>Now we get BDB SQL database ex_sql_binding.db.</p>
<p><strong>Use SQLite Manager to open the generated db</strong></p>
<p>Start SQLite Manager to open database db/build_unix/ex_sql_binding.db:<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/SQLiteManager.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/SQLiteManager.png" alt="" title="SQLiteManager" width="667" height="353" class="alignnone size-full wp-image-1308" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using DBSQL JDBC Driver in ADF/JDeveloper</title>
		<link>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/</link>
		<comments>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 09:28:17 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[ADF]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[JDeveloper]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1280</guid>
		<description><![CDATA[Oracle 应用程序开发框架 (Oracle ADF) 是一个端到端 J2EE 框架，该框架通过提供现成的基础架构服务和虚拟的声明式开发体验，从而简化了开发。JDeveloper是Oracle公司开发的Java集成开发环境（IDE）。本博客介绍了如何在ADF/JDeveloper中使用DBSQL作为JDBC数据库连接的引擎。
This guide describes how to apply DBSQL JDBC Driver in integrated development environment ADF/JDeveloper step by step.
Environment:

OS: Windows XP 32bit
ADF Business Components: 11.1.1.56.60
Java(TM) Platform: 1.6.0_18
JDeveloper:   11g Release 1(11.1.1.3.0)


1. Installing the Berkeley DB

Make sure that the Java environment you apply in the building should be the same as [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle 应用程序开发框架 (Oracle ADF) 是一个端到端 J2EE 框架，该框架通过提供现成的基础架构服务和虚拟的声明式开发体验，从而简化了开发。JDeveloper是Oracle公司开发的Java集成开发环境（IDE）。本博客介绍了如何在ADF/JDeveloper中使用DBSQL作为JDBC数据库连接的引擎。</p>
<p>This guide describes how to apply DBSQL JDBC Driver in integrated development environment ADF/JDeveloper step by step.<br />
<strong>Environment:</strong></p>
<ul>
<li>OS: Windows XP 32bit</li>
<li>ADF Business Components: 11.1.1.56.60</li>
<li>Java(TM) Platform: 1.6.0_18</li>
<li>JDeveloper:   11g Release 1(11.1.1.3.0)</li>
</ul>
<p><span id="more-1280"></span></p>
<h2>1. Installing the Berkeley DB</h2>
<ul>
<li>Make sure that the Java environment you apply in the building should be the same as ADF/JDeveloper&#8217;s.</li>
<li>Refer to http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_win_sql.html for instructions about building JDBC Driver on Windows platform. The Release build option is recommended.</li>
<li>Add the dll path into system <strong>PATH</strong>environment variable, e.g. add D:\jdbc\db-5.0.21\build_windows\Win32\Release to your %PATH%</li>
</ul>
<h2>2. Create JDBC Connection in JDeveloper</h2>
<p>2.1 Select File-&gt;new-&gt;General-&gt;Connections-&gt;Database Connection and fill in the form like Figure 1. Select button &#8220;new&#8221; to create new driver SQLiteJDBCDriver(see following Figure 2).<br />
<strong>Figure 1</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc2.png"><img class="alignnone size-full wp-image-1298" title="sc2" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc2.png" alt="" width="561" height="560" /></a></p>
<p>2.2 Create a new driver SQLiteJDBCDriver. You should back to Figure 1 after clicking button &#8220;OK&#8221;.<br />
<strong>Figure 2</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc1.png"><img class="alignnone size-full wp-image-1299" title="sc1" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc1.png" alt="" width="854" height="500" /></a></p>
<p>2.3 You can use button &#8220;Test Connection&#8221; to test the setting in Figure 1. If you encounter NullPointerException, please refer following section &#8220;Troubleshooting 4.1&#8243;</p>
<p>2.4 Create an empty project(or open an existing project). Select Edit-&gt;properties-&gt;Libraries Classpath to add the registered DBSQL_JDBC:<br />
<strong>Figure 3</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc3.png"><img class="alignnone size-full wp-image-1300" title="sc3" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc3.png" alt="" width="700" height="503" /></a></p>
<h2>3. Running the JDBC Sample Code</h2>
<p>This chapter only shows how to run the JDBC samples downloaded from Sun (now belongs to Oracle) Developer Network. You can skip this chapter if you already have a test environment.</p>
<p><strong> 3.1 Downloading JDBC sample code from Sun </strong><br />
You can download the JDBC sample code from Sun Developer Network. See &#8220;JDBC programming examples from all three editions (ZIP format)&#8221; at http://java.sun.com/products/jdbc/reference/codesamples/index.html.</p>
<p><strong> 3.2 Modifications Needed </strong><br />
Create an empty project and add all JDBC sample code into it. You will definitely need to:</p>
<ul>
<li>Replace <strong>Class.forName(&#8220;myDriver.ClassName&#8221;)</strong> in all sample code files with <strong>Class.forName(&#8220;SQLite.JDBCDriver&#8221;)</strong></li>
<li>Replace <strong>&#8220;jdbc:mySubprotocol:myDataSource&#8221;</strong> in all sample code files with <strong>jdbc:sqlite:/D:\\example.db</strong></li>
<li>Change the variable name <strong>&#8220;enum&#8221;</strong> in OutputApplet.java to <strong>&#8220;enum1&#8243;</strong>, since as <strong>&#8220;enum&#8221;</strong> is a keyword in some Java environment, and may not be used as an identifier. Otherwise, you may encounter &#8220;Error(87,31):  as of release 5, &#8216;enum&#8217; is a keyword, and may not be used as an identifier&#8221;</li>
</ul>
<p><strong> 3.3 Running examples </strong></p>
<table>
<tbody>
<tr>
<td>Example Name</td>
<td>Depended Example Name</td>
</tr>
<tr>
<td>CreateCoffees</td>
<td>None</td>
</tr>
<tr>
<td>InsertCoffees</td>
<td>CreateCoffees</td>
</tr>
<tr>
<td>BatchUpdate</td>
<td>CreateCoffees</td>
</tr>
<tr>
<td>InsertRow</td>
<td>CreateCoffees</td>
</tr>
<tr>
<td>InsertRows</td>
<td>CreateCoffees. This example has an issue: it should execute uprs.moveToInsertRow()  before each uprs.insertRow().</td>
</tr>
<tr>
<td>RSMetaDataMethods</td>
<td>CreateCoffees</td>
</tr>
<tr>
<td>TransactionPairs</td>
<td>CreateCoffees</td>
</tr>
<tr>
<td>TypeConcurrency</td>
<td>CreateCoffees</td>
</tr>
<tr>
<td>PrintColumns</td>
<td>CreateCoffees(or InsertCoffees, or BatchUpdate)</td>
</tr>
<tr>
<td>OutputApplet</td>
<td>CreateCoffees(or InsertCoffees, or BatchUpdate). This example also require AppletViewer environment.</td>
</tr>
<tr>
<td>CreateSuppliers</td>
<td>None</td>
</tr>
<tr>
<td>InsertSuppliers</td>
<td>CreateSuppliers</td>
</tr>
<tr>
<td>Join</td>
<td>InsertCoffees(or BatchUpdate) and InsertSuppliers</td>
</tr>
<tr>
<td>SQLStatement</td>
<td>InsertCoffees(or BatchUpdate) and InsertSuppliers</td>
</tr>
<tr>
<td>PrimaryKeysSuppliers</td>
<td>None</td>
</tr>
<tr>
<td>ForeignKeysCoffees</td>
<td>None</td>
</tr>
<tr>
<td>TypeInfo</td>
<td>None</td>
</tr>
<tr>
<td>TableTypes</td>
<td>None</td>
</tr>
</tbody>
</table>
<p>Other examples does not work because BDSQL JDBC driver does not support User-defined type or something like that.</p>
<p>Take SQLStatement.java for example, since it depends on &#8220;InsertCoffees(or BatchUpdate) and InsertSuppliers&#8221;, further more, &#8220;InsertCoffees(or BatchUpdate)&#8221; again depends on &#8220;CreateCoffees&#8221;, and &#8220;InsertSuppliers&#8221; depends on &#8220;CreateSuppliers&#8221;, so one reasonable sequence to run the SQLStatement example looks like this:</p>
<pre>Execute CreateCoffee.java
Execute CreateSuppliers.java
Execute InsertCoffee.java
Execute InsertSuppliers.java
Execute SQLStatement.java</pre>
<p>Finally, we can get result like below:</p>
<pre>Row 1:
   Column 1:  Acme, Inc.
   Column 2:  Colombian

Row 2:
   Column 1:  Acme, Inc.
   Column 2:  Colombian_Decaf

Process exited with exit code 0.</pre>
<p>Here is a screenshot of the execution result of the SQLStatement<br />
<strong>Figure 4</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc5.png"><img class="alignnone size-full wp-image-1301" title="sc5" src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc5.png" alt="" width="640" height="467" /></a></p>
<h2>4. Troubleshooting</h2>
<p><strong> 4.1 Edit db_sql_jdbc.vsproj for different JDK environemt </strong><br />
If you encounter one of following issues:</p>
<ul>
<li> Encounter NullPointerException in JDeveloper JDBCconnection testing(figure 1)</li>
<li> Hits &#8220;ClassNotFoundException: SQLite.JDBC2x.JDBCConnection&#8221; when executing Java programs.</li>
</ul>
<p>That means that your Java environment requires JDBC2x.* instead of JDBC2z.*. So you need to edit build_windows/ex_sql_jdbc.vcproj, replace all JDBC2z with JDBC2x and rebuild the project (ex_sql_jdbc.vcproj).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用DBSQL作为PHP PDO数据库引擎</title>
		<link>http://www.bdbchina.com/2010/04/%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%baphp-pdo%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%95%e6%93%8e/</link>
		<comments>http://www.bdbchina.com/2010/04/%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%baphp-pdo%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%95%e6%93%8e/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 12:58:44 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[PDO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1239</guid>
		<description><![CDATA[PHP Data Object(PDO)是PHP访问数据库的一个扩展库,也是目前PHP程序访问数据库的标准.PDO定义了一组访问数据库的抽象方法. 不论何种类型的数据库, 我们只用同样的接口访问就可以了.采用PDO接口的PHP程序具有独立性和开放性：与具体的数据库系统无关，与具体的操作系统无关.
本文介绍了如何在Linux环境下应用Berkeley DB SQL(DBSQL)作为PHP PDO数据库引擎.考虑到会有许多SQLite用户迁移到DBSQL以获得更高的并发性和性能,本文创建了一个SQLite3数据库并展示了如何将已有SQLite3数据库迁移到DBSQL上来.

1. 安装PDO SQLite
本文假定您已经有了一个可工作的Apache+PHP 5.x环境.此外,如果你没有一个可工作的PDO SQLite, 那么需要安装一个.以Ubuntu机器为例,我们只需要使用aptitude安装php5-sqlite即可.其它环境请Google/Baidu一下适用的安装步骤.
安装完成后,应该检查一下/usr/lib/php5/20060613+lfs目录下(该目录可能根据环境有所不同,以下一律以本机环境/usr/lib/php5/20060613+lfs为例)是否有pdo.so和pdo_sqlite.so文件:
debian:/usr/lib/php5/20060613+lfs# ls
pdo.so  pdo_sqlite.so
2. 数据库迁移
(是为了模拟SQLite3用户的迁移场景，本步骤准备了一个SQLite3数据库,并将其迁移到DBSQL数据上来)
创建SQLite3数据库/tmp/test.db,将以下文本保存为/tmp/create.sql:
CREATE TABLE Friends
([id] integer,
 [LastName] text,
 [FirstName] text,
 [Phone] text,
 CONSTRAINT [Index1] PRIMARY KEY ([id]));
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (1, 'Zhang', 'San', '1234-0000');
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (2, 'Li', 'Si', '1234-0001');
INSERT INTO Friends (id, LastName, [...]]]></description>
			<content:encoded><![CDATA[<p>PHP Data Object(PDO)是PHP访问数据库的一个扩展库,也是目前PHP程序访问数据库的标准.PDO定义了一组访问数据库的抽象方法. 不论何种类型的数据库, 我们只用同样的接口访问就可以了.采用PDO接口的PHP程序具有独立性和开放性：与具体的数据库系统无关，与具体的操作系统无关.</p>
<p>本文介绍了如何在Linux环境下应用Berkeley DB SQL(DBSQL)作为PHP PDO数据库引擎.考虑到会有许多SQLite用户迁移到DBSQL以获得更高的并发性和性能,本文创建了一个SQLite3数据库并展示了如何将已有SQLite3数据库迁移到DBSQL上来.<br />
<span id="more-1239"></span></p>
<h2>1. 安装PDO SQLite</h2>
<p>本文假定您已经有了一个可工作的Apache+PHP 5.x环境.此外,如果你没有一个可工作的PDO SQLite, 那么需要安装一个.以Ubuntu机器为例,我们只需要使用aptitude安装php5-sqlite即可.其它环境请Google/Baidu一下适用的安装步骤.</p>
<p>安装完成后,应该检查一下/usr/lib/php5/20060613+lfs目录下(该目录可能根据环境有所不同,以下一律以本机环境/usr/lib/php5/20060613+lfs为例)是否有pdo.so和pdo_sqlite.so文件:</p>
<pre class="java:nogutter">debian:/usr/lib/php5/20060613+lfs# ls
pdo.so  pdo_sqlite.so</pre>
<h2>2. 数据库迁移</h2>
<p>(是为了模拟SQLite3用户的迁移场景，本步骤准备了一个SQLite3数据库,并将其迁移到DBSQL数据上来)<br />
创建SQLite3数据库/tmp/test.db,将以下文本保存为/tmp/create.sql:</p>
<pre class="java:nogutter">CREATE TABLE Friends
([id] integer,
 [LastName] text,
 [FirstName] text,
 [Phone] text,
 CONSTRAINT [Index1] PRIMARY KEY ([id]));
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (1, 'Zhang', 'San', '1234-0000');
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (2, 'Li', 'Si', '1234-0001');
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (3, 'Wang', 'Wu', '1234-0002');</pre>
<p>使用sqlite3 shell创建一个test.db:</p>
<pre class="java:nogutter">/tmp$ cat create.sql | sqlite3 test.db</pre>
<p>到现在为止,我们已经模拟了现实场景:我们有一个可工作的PDO(SQLite)和数据库文件.接下来我们将它迁移到DBSQL上来:<br />
<strong>a) </strong>按照http://www.bdbchina.com/2010/04/在unixlinux平台上应用berkeley-db-11gr2-sql/,编译得到库libdb_sql-5.0.so(路径:$HOME/db-5.0.21/build_unix/.libs/libdb_sql-5.0.so)<br />
<strong>b)</strong> 按照以下步骤dump SQLite3数据库到test.dump文件:</p>
<pre class="java:nogutter">/tmp$ sqlite3 test.db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite&gt; .output test.dump
sqlite&gt; .dump
sqlite&gt; .quit</pre>
<p><strong>c)</strong> 使用DBSQL shell加载dump文件.加载完成后在/tmp目录下生成新的test.db及test.db-journal:</p>
<pre class="java:nogutter">/tmp$ mv test.db test.db.bak
/tmp$ $HOME/db-5.0.21/build_unix/dbsql test.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql&gt; .read test.dump
dbsql&gt; .quit
/tmp$ ls
create.sql  test.db  test.db-journal  test.dump  test.db.bak</pre>
<h2>3. 安装PDO DBSQL</h2>
<p>本步骤需要root权限.具体做法如下:<br />
<strong>a)</strong>复制libdb_sql-5.0.so到php lib目录下并改名为libdb_sql-50.so:</p>
<pre class="java:nogutter">    cp /build_unix/.libs/libdb_sql-5.0.so /usr/lib/php5/20060613+lfs/libdb_sql-50.so</pre>
<p><strong>b)</strong>使用vi编辑usr/lib/php5/20060613+lfs/pdo_sqlite.so(这是一个二进制文件),并将文件中的libsqlite3.so.0替换为libdb_sql-50.so(只有一处替换).这使得pdo_sqlite.so连接到DBSQL,而不是SQLite3.<br />
<strong>c)</strong>把usr/lib/php5/20060613+lfs/增加到HTTP Server的LD_LIBRARY_PATH环境变量中.否则Web Server无法找到libdb_sql-50.so. 不同的HTTP Server的具体做法不同.以Apache2为例,编辑/etc/apache2/envvars,增加一行:</p>
<pre class="java:nogutter">    export LD_LIBRARY_PATH=/usr/lib/php5/20060613+lfs/</pre>
<p><strong>d)</strong>重启HTTP Server,仍以Apache2为例:</p>
<pre class="java:nogutter">    /etc/init.d/apache2 restart</pre>
<h2>4. 使用PDO DBSQL</h2>
<p>创建好数据库后,我们用PDO接口来访问它:将以下PHP程序保存到HTTP服务器的根目录(如htdoc/)目录下并命名为pdo_dbsql.php:</p>
<pre class="PHP:Beautifier">&lt;?php
try {
    $db = new PDO("sqlite:/tmp/test.db");

    /*** The SQL SELECT statement ***/
    $sql = "SELECT * FROM Friends";
    $db-&gt;exec($sql);

    /*** Print Query Results ***/
    echo "&lt;table&gt;&lt;tr&gt;&lt;th&gt;ID&lt;/th&gt;&lt;th&gt;Last Name&lt;/th&gt;";
    echo "&lt;th&gt;First Name&lt;/th&gt;&lt;th&gt;Phone&lt;/th&gt;&lt;/tr&gt;";
    foreach ($db-&gt;query($sql) as $row) {
        echo "&lt;tr&gt;";
        echo "&lt;td&gt;".$row["id"]."&lt;/td&gt;";
        echo "&lt;td&gt;".$row["LastName"]."&lt;/td&gt;";
        echo "&lt;td&gt;".$row["FirstName"]."&lt;/td&gt;";
        echo "&lt;td&gt;".$row["Phone"]."&lt;/td&gt;";
        echo "&lt;/tr&gt;";
    }
    echo "&lt;/table&gt;";

    /*** close the database connection ***/
    $db = null;
} catch(PDOException $e) {
    echo $e-&gt;getMessage();
}
?&gt;</pre>
<p>使用Web浏览器访问我们编写好的pdo_dbsql.php(如http://192.168.1.131/pdo_dbsql.php),即可看到使用PDO的运行结果:<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/04/pdo_dbsql.png"><img class="alignnone size-full wp-image-1246" title="pdo_dbsql" src="http://www.bdbchina.com/wp-content/uploads/2010/04/pdo_dbsql.png" alt="" width="589" height="425" /></a></p>
<h2>5. 结束语</h2>
<p>本文我们介绍了如何将PDO数据引擎从SQLite迁移到DBSQL上来.对于直接采用DBSQL的用户而言,数据迁移一步可直接跳过,直接创建新的DBSQL数据库就好了.DBSQL与SQLite相比具有更高的并发性和性能,是值得PHP开发者尝试的全新SQL数据库引擎.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%baphp-pdo%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%95%e6%93%8e/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>在UNIX/Linux平台上应用Berkeley DB 11gR2 SQL</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 06:35:08 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1121</guid>
		<description><![CDATA[最新发布的Berkeley DB 11gR2是第一个支持SQL的版本，编译过程与以往版本稍有不同。本文将介绍如何在Linux/UNIX下编译 Berkeley DB SQL 5.0.21(以下简称DBSQL)，并运行DBSQL范例。

下载安装包
从官方网站下载db-5.0.21.tar.gz并解压缩获得db-5.0.21目录。
配置
cd db-5.0.21/build_unix
../dist/configure --enable-sql --enable-sql_compact
选项说明：

--enable-sql_compact：

使dbsql库(libdb_sql-5.0.so)包含db库(libdb-5.0.so)，这样libdb_sql-5.0.so就不依赖于db库，其中dbsql提供了SQL API，db库包含原有的BDB功能，这样应用程序不需要链接两个库，方便使用。编译得到的库与sqlite 3.6.22版本对应。方便使用。编译得到的库与sqlite 3.6.22版本对应。



其它常用配置选项：

只编译静态库：

加上"--disable-shared"。


编译最小库：

加上"--enable-smallbuild --enable-statistics"。
这里的--enable-statistics是必须搭配--enable-smallbuild使用的。因为默认的smallbuild不包含dbsql所需要的statistics组件。
常规编译获得的DBSQL动态库大小为2.2M，而最小方式编译得到的库大小为1.1M。话说回来，对于UNIX/Linux大多数应用来说，多个1M大小不是问题，而且smallbuild会采用Os编译器优化选项(尺寸优先)取代O3选项(速度优先)，性能会有所下降。



编译
make dbsql
对于动态编译方式，实际库文件在build_unix/.libs目录下，文件：
.libs/libdb_sql-5.0.so (动态库文件)
.libs/dbsql (交互式命令行工具)
而对于静态编译方式，库文件在build_unix/目录下，文件：
libdb_sql-5.0.a (静态库文件)
dbsql (交互式命令行工具)
如果你需要使用各种BDB工具(如db_dump, db_load等)，进一步执行编译指令make，你将能够得到BDB所提供的所有的库文件和工具，包括之前make dbsql得到的库，以及除了上述db_dump, db_load之外的其他所有BDB提供的工具，熟悉BDB的用户一定对此不陌生。
最后，如果你需要清除包括Makefile在内的所有编译文件，可执行make distclean。Makefile是由configure生成的，单纯的&#8221;make clean&#8221;不能清除这部分记录。
编译并运行范例
DBSQL的C API完全沿用SQLite的C API，这里是SQLite3 C API列表。sql/examples/目录下有多个参考范例。以下我们以C语言范例sql/examples/c/ex_sql_index.c为例：
make ex_sql_index
./ex_sql_index
程序做了以下几件事情：

1. 把表格university加载到数据库
2. 打印以下SQL语句的Query Plan。我们可以看到Query Plan中的VDBE指令有32条。并且有两条向前跳转的Next指令，表示出现了两次循环迭代。
        SELECT rank, country, name
        from university
   [...]]]></description>
			<content:encoded><![CDATA[<p>最新发布的Berkeley DB 11gR2是第一个支持SQL的版本，编译过程与以往版本稍有不同。本文将介绍如何在Linux/UNIX下编译 Berkeley DB SQL 5.0.21(以下简称DBSQL)，并运行DBSQL范例。<br />
<span id="more-1121"></span></p>
<h2>下载安装包</h2>
<p>从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">官方网站</a>下载db-5.0.21.tar.gz并解压缩获得db-5.0.21目录。</p>
<h2>配置</h2>
<pre class="java:nogutter">cd db-5.0.21/build_unix
../dist/configure --enable-sql --enable-sql_compact</pre>
<p><strong>选项说明：</strong></p>
<ul>
<li><tt>--enable-sql_compact：</tt>
<ul>
<li><tt>使dbsql库(libdb_sql-5.0.so)包含db库(libdb-5.0.so)，这样libdb_sql-5.0.so就不依赖于db库，其中dbsql提供了SQL API，db库包含原有的BDB功能，这样应用程序不需要链接两个库，方便使用。编译得到的库与sqlite 3.6.22版本对应。方便使用。编译得到的库与sqlite 3.6.22版本对应。</tt></li>
</ul>
</li>
</ul>
<p><strong>其它常用配置选项：</strong></p>
<ul>
<li><tt>只编译静态库：</tt>
<ul>
<li><tt>加上"--disable-shared"。</tt></li>
</ul>
</li>
<li><tt>编译最小库：</tt>
<ul>
<li><tt>加上"--enable-smallbuild --enable-statistics"。</tt></li>
<li><tt>这里的--enable-statistics是必须搭配--enable-smallbuild使用的。因为默认的smallbuild不包含dbsql所需要的statistics组件。</tt></li>
<li><tt>常规编译获得的DBSQL动态库大小为2.2M，而最小方式编译得到的库大小为1.1M。话说回来，对于UNIX/Linux大多数应用来说，多个1M大小不是问题，而且smallbuild会采用Os编译器优化选项(尺寸优先)取代O3选项(速度优先)，性能会有所下降。</tt></li>
</ul>
</li>
</ul>
<h2>编译</h2>
<pre class="java:nogutter">make dbsql</pre>
<p>对于动态编译方式，实际库文件在build_unix/.libs目录下，文件：</p>
<pre class="java:nogutter">.libs/libdb_sql-5.0.so (动态库文件)
.libs/dbsql (交互式命令行工具)</pre>
<p>而对于静态编译方式，库文件在build_unix/目录下，文件：</p>
<pre class="java:nogutter">libdb_sql-5.0.a (静态库文件)
dbsql (交互式命令行工具)</pre>
<p>如果你需要使用各种BDB工具(如db_dump, db_load等)，进一步执行编译指令make，你将能够得到BDB所提供的所有的库文件和工具，包括之前make dbsql得到的库，以及除了上述db_dump, db_load之外的其他所有BDB提供的工具，熟悉BDB的用户一定对此不陌生。</p>
<p>最后，如果你需要清除包括Makefile在内的所有编译文件，可执行make distclean。Makefile是由configure生成的，单纯的&#8221;make clean&#8221;不能清除这部分记录。</p>
<h2>编译并运行范例</h2>
<p>DBSQL的C API完全沿用SQLite的C API，<a href="http://www.sqlite.org/c3ref/funclist.html">这里</a>是SQLite3 C API列表。sql/examples/目录下有多个参考范例。以下我们以C语言范例sql/examples/c/ex_sql_index.c为例：</p>
<pre class="java:nogutter">make ex_sql_index
./ex_sql_index</pre>
<p>程序做了以下几件事情：</p>
<ul>
<li>1. 把表格university加载到数据库</li>
<li>2. 打印以下SQL语句的Query Plan。我们可以看到Query Plan中的VDBE指令有32条。并且有两条向前跳转的Next指令，表示出现了两次循环迭代。
<pre class="java:nogutter">        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;</pre>
</li>
<li>3. 增加关于region, country的索引</li>
<li>4. 再次打印Query Plan。我们可以看到Query Plan中的VDBE指令简化到了21条。并且只有一次向前跳转的Next指令，表示只(在索引上)出现了一次循环迭代。</li>
<li>5. 删除关于region, country的索引</li>
</ul>
<p>以下是程序输出：</p>
<pre class="java:nogutter">================================================================================
Load data source ../sql/examples/data/university.csv into database.
Load done.
================================================================================
STEP1. Explain a query expression
SQL:    EXPLAIN
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
  0     Trace   0       0       0               00      (null)
  1     OpenEphemeral   1       3       0       keyinfo(1,BINARY)       00      (null)
  2     String8 0       1       0       Europe  00      (null)
  3     Goto    0       29      0               00      (null)
  4     OpenRead        0       3       0       5       00      (null)
  5     Rewind  0       18      0               00      (null)
  6     Column  0       4       2               00      (null)
  7     Ne      1       17      2       collseq(BINARY) 69      (null)
  8     Column  0       0       4               00      (null)
  9     Column  0       3       5               00      (null)
  10    Column  0       1       6               00      (null)
  11    MakeRecord      4       3       2               00      (null)
  12    Column  0       3       7               00      (null)
  13    Sequence        1       8       0               00      (null)
  14    Move    2       9       1               00      (null)
  15    MakeRecord      7       3       3               00      (null)
  16    IdxInsert       1       3       0               00      (null)
  17    Next    0       6       0               01      (null)
  18    Close   0       0       0               00      (null)
  19    OpenPseudo      2       2       3               00      (null)
  20    Sort    1       27      0               00      (null)
  21    Column  1       2       2               00      (null)
  22    Column  2       0       4               20      (null)
  23    Column  2       1       5               00      (null)
  24    Column  2       2       6               00      (null)
  25    ResultRow       4       3       0               00      (null)
  26    Next    1       21      0               00      (null)
  27    Close   2       0       0               00      (null)
  28    Halt    0       0       0               00      (null)
  29    Transaction     0       0       0               00      (null)
  30    VerifyCookie    0       5       0               00      (null)
  31    TableLock       0       3       0       university      00      (null)
  32    Goto    0       4       0               00      (null)
================================================================================
STEP2. Create an index on university(region, country)
SQL:    CREATE INDEX university_geo
        ON university (region, country);
================================================================================
STEP3. Explain the query again, we can see the difference
SQL:    EXPLAIN
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
  0     Trace   0       0       0               00      (null)
  1     Noop    0       0       0               00      (null)
  2     String8 0       1       0       Europe  00      (null)
  3     Goto    0       18      0               00      (null)
  4     OpenRead        0       3       0       5       00      (null)
  5     OpenRead        2       4       0       keyinfo(2,BINARY,BINARY)        00      (null)
  6     SeekGe  2       15      1       1       00      (null)
  7     IdxGE   2       15      1       1       01      (null)
  8     IdxRowid        2       2       0               00      (null)
  9     Seek    0       2       0               00      (null)
  10    Column  0       0       3               00      (null)
  11    Column  2       1       4               00      (null)
  12    Column  0       1       5               00      (null)
  13    ResultRow       3       3       0               00      (null)
  14    Next    2       7       0               00      (null)
  15    Close   0       0       0               00      (null)
  16    Close   2       0       0               00      (null)
  17    Halt    0       0       0               00      (null)
  18    Transaction     0       0       0               00      (null)
  19    VerifyCookie    0       6       0               00      (null)
  20    TableLock       0       3       0       university      00      (null)
  21    Goto    0       4       0               00      (null)
================================================================================
STEP4. Drop the index
SQL: DROP INDEX university_geo;
DONE.</pre>
<h2>使用dbsql shell</h2>
<p>范例运行完后，我们还可以用dbsql shell来查看/操作生成的数据库文件：</p>
<pre class="java:nogutter">build_unix$ ./dbsql ex_sql_index.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql&gt; .tables
university
dbsql&gt; select * from university;
1|Massachusetts Institute of Technology|mit.edu|us|North America|2|1|1|7
2|Harvard University|harvard.edu|us|North America|7|2|12|1
3|Stanford University|stanford.edu|us|North America|4|4|2|24
4|University of California Berkeley|berkeley.edu|us|North America|8|3|5|32
5|Cornell University|cornell.edu|us|North America|1|5|9|37
6|University of Wisconsin Madison|wisc.edu|us|North America|3|10|6|71
7|University of Minnesota|umn.edu|us|North America|6|15|7|22
8|California Institute of Technology|caltech.edu|us|North America|18|6|20|30
9|University of Illinois Urbana Champaign|uiuc.edu|us|North America|17|7|13|51
10|University of Michigan|umich.edu|us|North America|10|8|18|55
11|University of Texas Austin|utexas.edu|us|North America|12|11|8|44
12|University of Washington|washington.edu|us|North America|22|9|4|94
13|University of Chicago|uchicago.edu|us|North America|42|16|44|2
14|Carnegie Mellon University|cmu.edu|us|North America|5|24|3|93
15|University of Pennsylvania|upenn.edu|us|North America|16|14|33|26
16|Columbia University New York|columbia.edu|us|North America|19|12|21|95
17|Texas A&amp;M University|tamu.edu|us|North America|31|31|11|17
18|University of Maryland|umd.edu|us|North America|37|22|17|52
19|University of California Los Angeles|ucla.edu|us|North America|13|17|26|110
20|Purdue University|purdue.edu|us|North America|14|34|14|46
21|Johns Hopkins University|jhu.edu|us|North America|59|27|49|3
22|University of Cambridge|cam.ac.uk|uk|Europe|26|13|70|86
23|Pennsylvania State University|psu.edu|us|North America|27|29|16|102
24|University of Tokyo|u-tokyo.ac.jp|jp|Asia|32|26|65|31
25|University of Arizona|arizona.edu|us|North America|20|36|19|134
dbsql&gt; .quit</pre>
<h2>结束语</h2>
<p>以上我们介绍了如何在UNIX/Linux环境下编译DBSQL并运行范例。在这一版本开发中，我们为新增SQL部分增加了十个范例，可作为快速参考:</p>
<pre class="java:nogutter">1.ex_sql_load:          create table, insert, load csv files
2.ex_sql_query:         select, order by, group by, subquery, SQL function
3.ex_sql_index:         index, query explain
4.ex_sql_statment:      prepare, iterate results, callback function
5.ex_sql_transaction:   transaction, commit, rollback
6.ex_sql_savepoint:     savepoint
7.ex_sql_multi_thread:  multi-thread, transaction, lock/busy handle
8.ex_sql_binding:       prepare, variable binding, transaction, bulk insert
9.ex_sql_fts3:          full-text search features
10.ex_sql_rtree:        create, maintain, and query r-tree index</pre>
<p>如果您有什么问题和建议，欢迎与我联系。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(drop-in模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:50 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=980</guid>
		<description><![CDATA[前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。
本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。

1. 编译Android代码
从Android官方网站获取一份Android源代码，这份源代码有2~3G之巨。
在Linux平台上，把源代码解压到$HOME/android/android_src
安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:

$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH

先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：

$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make

可看到生成三个镜像：

Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img

2. 安装Android SDK并测试镜像
安装Android SDK: http://developer.android.com/sdk/installing.html, 安装目录：$HOME/android/android-sdk-linux_86
安装Android SDK组件: http://developer.android.com/sdk/adding-components.html,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7
用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。

$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img [...]]]></description>
			<content:encoded><![CDATA[<p>前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。</p>
<p>本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。</p>
<p><span id="more-980"></span></p>
<h2>1. 编译Android代码</h2>
<p>从<a href="http://source.android.com/download">Android官方网站</a>获取一份Android源代码，这份源代码有2~3G之巨。</p>
<p>在Linux平台上，把源代码解压到$HOME/android/android_src</p>
<p>安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:</p>
<pre name="code" class="java:nogutter">
$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH
</pre>
<p>先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make
</pre>
<p>可看到生成三个镜像：</p>
<pre name="code" class="java:nogutter">
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
</pre>
<h2>2. 安装Android SDK并测试镜像</h2>
<p>安装Android SDK: <a href="http://developer.android.com/sdk/installing.html">http://developer.android.com/sdk/installing.html</a>, 安装目录：$HOME/android/android-sdk-linux_86<br />
安装Android SDK组件: <a href="http://developer.android.com/sdk/adding-components.html">http://developer.android.com/sdk/adding-components.html</a>,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7</p>
<p>用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img images
</pre>
<p>创建并运行一个新的设备:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/tools/
$ ./android
</pre>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png" alt="" title="bdb_drop_in_3" width="498" height="287" class="alignnone size-full wp-image-995" /></a></p>
<p>(如图)使用图形界面工具创建一个Android 2.1的设备BDBSQL,并点击&#8221;start&#8221;启动。新的设备第一次启动的时间会非常长，这是正常现象。等到Android界面出现，就说明我们的镜像编译基本没问题了。接下来我们进一步把SQLite库替换为BDB。</p>
<h2>3. 编译DBSQL</h2>
<p>从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">http://www.oracle.com/technology/software/products/berkeley-db/index.html</a>下载BDB 11gR2源文件(db-5.0.x.tar.gz)，然后</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src/external/sqlite/dist
$ tar zxvf db-5.0.x.tar.gz
$ cp Android.mk Android.mk.bak
$ cp db-5.0.x/build_android/Android.mk .
</pre>
<p>编辑Android.mk，默认的BDB Log和Region文件大小总和可达到十几兆，因此我们有必要修改Android.mk来减小它(可能需要为Android.mk去掉只读属性)。修改第一处LOCAL_CFLAGS如下所示(相对于默认配置，我们删除了-DSQLITE_OMIT_TRUNCATE_OPTIMIZATION，新增了-DSQLITE_DEFAULT_CACHE_SIZE=256 -DBDBSQL_MAX_LOCKS=1000 -DBDBSQL_MAX_LOCK_OBJECTS=1000)：</p>
<pre name="code" class="java:nogutter">
LOCAL_CFLAGS += -Wall -DHAVE_USLEEP=1 \
        -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
        -DSQLITE_THREADSAFE=1 -DNDEBUG=1 -DSQLITE_TEMP_STORE=3 \
        -DSQLITE_OS_UNIX=1 \
        -D_HAVE_SQLITE_CONFIG_H -DSQLITE_THREAD_OVERRIDE_LOCK=-1 \
        -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_BACKWARDS -Dfdatasync=fsync \
        -DSQLITE_DEFAULT_CACHE_SIZE=256 \
        -DBDBSQL_MAX_LOCKS=1000 \
        -DBDBSQL_MAX_LOCK_OBJECTS=1000
</pre>
<p>如果确定不会在多进程间共享数据库，还可以在上述LOCAL_CFLAGS中加入&#8221;-DBDBSQL_OMIT_SHARING&#8221;，这样日志文件不会被写入文件系统，进一步节省了设备空间。</p>
<p>编译系统镜像中的SQLite部分:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make clean-libsqlite
$ mmm -B external/sqlite/dist
$ make snod
</pre>
<p>编译好了，再来一次镜像替换：</p>
<pre name="code" class="java:nogutter">
$ cp $HOME/android/android_src/out/target/product/generic/*.img $HOME/android/android-sdk-linux_86/platforms/android-2.1/images
</pre>
<p>使用图形界面工具删除先前的设备BDBSQL，重创建一个新的Android 2.1设备BDBSQL,并点击&#8221;start&#8221;启动。这里一定要创建新的设备，因为启动过的设备，其数据库文件已被SQLite生成，DBSQL无法访问。</p>
<h2>4. 使用DBSQL</h2>
<p>现在Android里所有应用程序的SQL存储引擎都已被替换为DBSQL了。我们使用&#8221;联系人&#8221;来试用一下我们的新设备吧，在Setting里面把Locate设置为中文简体，安装一个中文输入法(比如搜狗)，然后打开“联系人”，随便增加一条记录：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg" alt="" title="bdb_drop_in_5" width="600" height="421" class="alignnone size-full wp-image-1001" /></a></p>
<p>在主机上我们可以使用adb shell来查看并操作程序所生成的数据库。请留意sqlite3 shell输出的版本信息是Berkeley DB 11gR，同时shell的提示符是dbsql>，这说明我们已经把SQLite成功替换为DBSQL引擎：</p>
<pre name="code" class="java:nogutter">
$ adb shell
# cd /data/data/com.android.providers.contacts/databases/
# sqlite3 contacts2.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .tables
_sync_state                       status_updates
_sync_state_metadata              v1_settings
activities                        view_contacts
agg_exceptions                    view_contacts_restricted
android_metadata                  view_data
calls                             view_data_restricted
contact_entities_view             view_groups
contact_entities_view_restricted  view_raw_contacts
contacts                          view_raw_contacts_restricted
data                              view_v1_contact_methods
groups                            view_v1_extensions
mimetypes                         view_v1_group_membership
name_lookup                       view_v1_groups
nickname_lookup                   view_v1_organizations
packages                          view_v1_people
phone_lookup                      view_v1_phones
raw_contacts                      view_v1_photos
settings
dbsql> select * from contacts;
2|逍遥 李|||0|0|0|0|1|1|0nE08B4A8BFA37D4||0
dbsql> select * from data;
1||4|1|0|0|0|li|li|||||||||||||||||
2||6|2|0|0|0|66666666|1||66666666|||||||||||||||
3||6|2|0|0|0|88888888|2||88888888|||||||||||||||
4||8|2|0|0|0|蜀山|1|||||||||||||||||
5||4|2|0|0|0|逍遥 李|逍遥|李||||||||||||||||
dbsql>
</pre>
<h2>5. 结束语</h2>
<p>关于DBSQL库在Android平台上的编译和使用的介绍到这里就结束了。我们用两篇博文分别介绍了side-by-side(并存)和Drop-in(替换)这两种使用方式。在Drop-in模式下，现有的应用程序无修改就可以直接使用DBSQL引擎。</p>
<p>DBSQL在开发过程中始终给予Android平台高度重视，在开发过程中投入了多位资深工程师致力于将DBSQL移植到Android平台上，并将Android列为产品周期测试的主流平台。OARDC的工程师Zengfa.Dou和Stephen.Tang给予了我这个初学者极大帮助。在此一并致谢！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(side-by-side模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:14 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=946</guid>
		<description><![CDATA[Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;以及更多关于Oracle Berkeley DB SQL的报道。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。
本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。

1. 安装开发环境
(本文假定读者已具备初步的Android Emulator使用经验)
安装SDK
从http://developer.android.com/sdk/index.html下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。
安装NDK
从http://developer.android.com/intl/zh-TW/sdk/ndk/index.html下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。

$ cd android-ndk-1.6_r3
$ build/host-setup.sh

安装NDK Wapper
从开心网共享文件夹下载ndk-wrappers.tgz到$HOME/android

$ tar zxvf ndk-wrappers.tgz

ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：
export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc

(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)
开始安装ndk-wrapper：

$ cd ndk-wrappers
$ ./setup.sh

修改Ndk-Wrapper
修改ndk-wrappers/bin/arm-linux-gcc:

1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden

试验Ndk-Wrapper是否可工作
$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见<a href="http://www.bdbchina.com/2010/03/oracle-berkeley-db-%E6%94%AF%E6%8C%81sql%E5%95%A6%EF%BC%81/">博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;</a>以及<a href="http://www.bdbchina.com/2010/03/%E6%9B%B4%E5%A4%9A%E5%85%B3%E4%BA%8Eoracle-berkeley-db-sql%E7%9A%84%E6%8A%A5%E9%81%93/">更多关于Oracle Berkeley DB SQL的报道</a>。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。</p>
<p>本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。</p>
<p><span id="more-946"></span></p>
<h2>1. 安装开发环境</h2>
<p>(本文假定读者已具备初步的Android Emulator使用经验)<br />
<strong>安装SDK</strong><br />
从<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。</p>
<p><strong>安装NDK</strong><br />
从<a href="http://developer.android.com/intl/zh-TW/sdk/ndk/index.html">http://developer.android.com/intl/zh-TW/sdk/ndk/index.html</a>下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。</p>
<pre class="java:nogutter">
$ cd android-ndk-1.6_r3
$ build/host-setup.sh
</pre>
<p><strong>安装NDK Wapper</strong><br />
从开心网<a "http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=557046&#038;start=0">共享文件夹</a>下载ndk-wrappers.tgz到$HOME/android</p>
<pre class="java:nogutter">
$ tar zxvf ndk-wrappers.tgz
</pre>
<p>ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：</p>
<pre class="java:nogutter">export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc
</pre>
<p>(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)</p>
<p>开始安装ndk-wrapper：</p>
<pre class="java:nogutter">
$ cd ndk-wrappers
$ ./setup.sh
</pre>
<p><strong>修改Ndk-Wrapper</strong><br />
修改ndk-wrappers/bin/arm-linux-gcc:</p>
<pre class="java">
1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden
</pre>
<p><strong>试验Ndk-Wrapper是否可工作</strong></p>
<pre class="java:nogutter">$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</pre>
<h2>2. 编译DBSQL</h2>
<p>以下我们使用上面搭建的NDK编译环境来编译适用于Android平台上的DBSQL库。首先从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">Oracle官网</a>上下载Berkeley DB 11gR2(.tar.gz), 解压并改名为db/</p>
<p><strong>设置CFLAGS</strong></p>
<pre class="java:nogutter">
$ export CFLAGS="-DHAVE_USLEEP=1 -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
-DNDEBUG=1 -DSQLITE_TEMP_STORE=3 -DSQLITE_OS_UNIX=1 -D_HAVE_SQLITE_CONFIG_H \
-DSQLITE_THREAD_OVERRIDE_LOCK=-1 -Dfdatasync=fsync -DNO_ANDROID_FUNCS \
-DSQLITE_THREADSAFE=1"
</pre>
<p><strong>设置为动态编译方式</strong></p>
<pre class="java:nogutter">
$ cd db/build_unix
$ ../dist/configure --prefix=$HOME/android/install_db_arm --target=arm-linux \
--host=arm-linux --enable-smallbuild --enable-sql --enable-sql_compat \
--enable-statistics --enable-amalgamation
</pre>
<p><strong>修改build_unix/db_config.h</strong><br />
每次configure完成后，切记都要编辑build_unix/db_config.h，删除以下两行：</p>
<pre class="java:nogutter">#define HAVE_PREAD 1
#define HAVE_PWRITE 1
</pre>
<p><strong>开始编译</strong></p>
<pre class="java:nogutter">
$ make dbsql
</pre>
<p>生成的动态库文件为.libs/libdb_sql-5.0.so，Shell文件为.libs/dbsql。</p>
<h2>3. 使用DBSQL库</h2>
<p>我们使用现成的DBSQL范例来演示如何在自己的程序中使用DBSQL库</p>
<p><strong>编译范例</strong></p>
<pre class="java:nogutter">
$ cd  build_unix
$ make ex_sql_query
</pre>
<p>编译完成后生成范例程序.libs/ex_sql_query /data/bdb</p>
<p><strong>运行范例</strong><br />
启动Android Emulator，上传，并运行DBSQL库和范例</p>
<pre class="java:nogutter">
$ adb shell mkdir /data/bdb
$ adb shell mkdir /data/sql/examples/data
$ adb shell mkdir /data/sql
$ adb shell mkdir /data/sql/examples
$ adb shell mkdir /data/sql/examples/data
$ adb push .libs/libdb_sql-5.0.so /data/bdb
$ adb push .libs/ex_sql_query /data/bdb
$ adb push ../sql/examples/data/ /data/sql/examples/data
$ adb shell "cd /data/bdb; export LD_LIBRARY_PATH=/data/bdb; ./ex_sql_query"
</pre>
<p>现在终端应该已经输出query范例的运行结果了。以下是GUI终端的输出截图：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg"><img class="alignnone size-full wp-image-975" title="bdbsql_android_sidebyside" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg" alt="" width="480" height="332" /></a></p>
<h2>4. 结束语</h2>
<p>至此，关于BDB 11gR2 SQL库的side-by-side编译模式的介绍就结束了。我们可将编译得到的库应用到自己的程序中去。side-by-side模式的优点不改动Android系统底层库和镜像，使用简单。缺点是只能用C/JNI方式调用，无法用Android自带的SQL接口直接调用。而与此对应的是Drop-in模式，Drop-in模式可将Android系统的SQLite层整个替换为BDB 11gR2 SQL，应用程序无修改就可以直接使用，是一种更为强大彻底的应用模式。我们将在后续文章中介绍Drop-in模式的编译方式。</p>
<input id="gwProxy" type="hidden" />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>采用Berkeley DB XML PHP建立原生XML Web服务器</title>
		<link>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
		<comments>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 05:58:39 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=618</guid>
		<description><![CDATA[近十年来，XML应用越发广泛，政府也推出了《基于XML的电子公文格式规范》等标准。那么，在需要XML数据库引擎的情况下，采用原生XML数据库Berkeley DB XML(以下简称BDB XML)取代MySQL(或其它传统DB)做后台数据库是一个更好的选择。
BDB XML是Oracle推出的一款开源原生XML数据库。与传统数据库相比，原生XML数据库的优势有：
1. 可以直接操作XML文件，XML数据无损&#8211;在某些场合，无损的数据源意味着法律效力。
2. 原生检索方式，支持XQuery和XPath，符合XML习惯。
3. 性能优化：原生XML数据库会针对XML特点进行各种优化，如插入文档索引、建立节点ID等。
4. 支持相同数据的不同视图。
和其它原生XML数据库相比，BDB XML优势有：
1. 完整的ACID 事务处理、自动恢复、热备份、用于分布式事务的HA支持。
2. 支持XQuery(含XQuery Update)和XPATH。
3. 可以利用其特有的二进制元数据存取大容量二进制对象(非XML数据)。
4. 支持全Unicode字符集，中文存储、查询都不成问题。
5. 提供一套容器和迭代器接口访问和操作查询结果。
6. 提供交互式命令行工具。

以上第三点是一个非常实用的特性，某种程度上它补足了XML应用的”最后一公里“：比方说，你正在为教育部门开发一个考生管理数据库，需要将考生的资料存成XML文档，那么存取照片(二进制数据)就相当麻烦。一般来讲传统的选择有两种：一是转换为Base64Binary格式嵌入到XML文档中，这意味着存取两端都需要转换大量图片数据，效率就很低下;二是为每个照片生成一个引用再另存它处，只在XML文档中保留一个引用，这种方法不但复杂，而且把数据从文档中分割了出来，损失了ACID特性，管理不便。而使用BDB XML就可以将照片数据直接以二进制元数据的形式嵌入到XML文档中，存取都非常方便，还可以基于数据库实现图像/视频检索。
下面，介绍一下BDB XML PHP的安装过程：
安装Apache+PHP环境
好吧，这是一个烂大街的话题，网上一抓一大把。下面以Debian 5.0和apache2为例：
用aptitude安装以下软件包：

apache2
libapache2-mod-php5
php5
php5-dev
php5-cgi
安装完毕。启动Apache服务器：
sudo /etc/init.d/apache2 start
测试一下是否安装成功，首先找到http的根目录(本机环境是/var/www)，在该目录下生成php测试文件test.php(内容如下)：
&#60;?phpinfo();?&#62;
用浏览器打开网页服务器的test.php，如果安装成功，会打开php信息页。
安装BDB XML PHP
移步http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载源码包dbxml-2.5.13.tar.gz，并放置在$HOME目录下。下面以Linux上的安装为例：

cd $HOME
tar zxf dbxml-2.5.13.tar.gz
cd dbxml-2.5.13
./buildall
cd db-4.8.24/php_db4
phpize
./configure --with-db4=$PWD/../../install
make
sudo make install
cd ../../dbxml/src/php/
phpize
./configure --with-dbxml=$PWD/../../../install
make
sudo make install

接下来编辑/etc/php5/apache2/php.ini和/etc/php5/cgi/php.ini文件(可能路径略有不同)，把以下两行加到Dynamic Extensions段：
extension=db4.so
extension=dbxml.so
大功告成，为保安全，最好重启一下Apache服务器。到此BDB XML PHP全部安装成功。在实际应用中，需要特别注意帐户和权限问题：要保证Apache的运行帐户对容器(Container)文件及其所在目录有读写权限。
范例
从开心网的群共享页面http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=450163&#038;start=0下载附件xmlData.tar.gz，解压后，将xmlData目录下的所有文件拷贝到http根目录下，然后执行：
./gen_cont.sh $HOME/dbxml-2.5.13/install/bin/dbxml
脚本即会生成一个容器：simple.dbxml。该容器内包含三百多个xml文档，形如：
&#60;?xml version="1.0"?&#62;
&#60;产品&#62;
    &#60;种类&#62;fruits&#60;/种类&#62;
    &#60;商品&#62;Avocado&#60;/商品&#62;
    &#60;存货&#62;
 [...]]]></description>
			<content:encoded><![CDATA[<p>近十年来，XML应用越发广泛，政府也推出了《基于XML的电子公文格式规范》等标准。那么，在需要XML数据库引擎的情况下，采用原生XML数据库Berkeley DB XML(以下简称BDB XML)取代MySQL(或其它传统DB)做后台数据库是一个更好的选择。</p>
<p>BDB XML是Oracle推出的一款开源原生XML数据库。与传统数据库相比，原生XML数据库的优势有：<br />
1. 可以直接操作XML文件，XML数据无损&#8211;在某些场合，无损的数据源意味着法律效力。<br />
2. 原生检索方式，支持XQuery和XPath，符合XML习惯。<br />
3. 性能优化：原生XML数据库会针对XML特点进行各种优化，如插入文档索引、建立节点ID等。<br />
4. 支持相同数据的不同视图。</p>
<p>和其它原生XML数据库相比，BDB XML优势有：<br />
1. 完整的ACID 事务处理、自动恢复、热备份、用于分布式事务的HA支持。<br />
2. 支持XQuery(含XQuery Update)和XPATH。<br />
3. 可以利用其特有的二进制元数据存取大容量二进制对象(非XML数据)。<br />
4. 支持全Unicode字符集，中文存储、查询都不成问题。<br />
5. 提供一套容器和迭代器接口访问和操作查询结果。<br />
6. 提供交互式命令行工具。<br />
<span id="more-618"></span><br />
以上第三点是一个非常实用的特性，某种程度上它补足了XML应用的”最后一公里“：比方说，你正在为教育部门开发一个考生管理数据库，需要将考生的资料存成XML文档，那么存取照片(二进制数据)就相当麻烦。一般来讲传统的选择有两种：一是转换为Base64Binary格式嵌入到XML文档中，这意味着存取两端都需要转换大量图片数据，效率就很低下;二是为每个照片生成一个引用再另存它处，只在XML文档中保留一个引用，这种方法不但复杂，而且把数据从文档中分割了出来，损失了ACID特性，管理不便。而使用BDB XML就可以将照片数据直接以二进制元数据的形式嵌入到XML文档中，存取都非常方便，还可以基于数据库实现图像/视频检索。</p>
<p>下面，介绍一下BDB XML PHP的安装过程：</p>
<h2>安装Apache+PHP环境</h2>
<p>好吧，这是一个烂大街的话题，网上一抓一大把。下面以Debian 5.0和apache2为例：<br />
用aptitude安装以下软件包：</p>
<pre>
apache2
libapache2-mod-php5
php5
php5-dev
php5-cgi</pre>
<p>安装完毕。启动Apache服务器：</p>
<pre>sudo /etc/init.d/apache2 start</pre>
<p>测试一下是否安装成功，首先找到http的根目录(本机环境是/var/www)，在该目录下生成php测试文件test.php(内容如下)：</p>
<blockquote><p>&lt;?phpinfo();?&gt;</p></blockquote>
<p>用浏览器打开网页服务器的test.php，如果安装成功，会打开php信息页。</p>
<h2>安装BDB XML PHP</h2>
<p>移步http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载源码包dbxml-2.5.13.tar.gz，并放置在$HOME目录下。下面以Linux上的安装为例：</p>
<pre>
cd $HOME
tar zxf dbxml-2.5.13.tar.gz
cd dbxml-2.5.13
./buildall
cd db-4.8.24/php_db4
phpize
./configure --with-db4=$PWD/../../install
make
sudo make install
cd ../../dbxml/src/php/
phpize
./configure --with-dbxml=$PWD/../../../install
make
sudo make install
</pre>
<p>接下来编辑/etc/php5/apache2/php.ini和/etc/php5/cgi/php.ini文件(可能路径略有不同)，把以下两行加到Dynamic Extensions段：</p>
<pre>extension=db4.so
extension=dbxml.so</pre>
<p>大功告成，为保安全，最好重启一下Apache服务器。到此BDB XML PHP全部安装成功。在实际应用中，需要特别注意帐户和权限问题：<span style="color: #ff0000;"><strong>要保证Apache的运行帐户对容器(Container)文件及其所在目录有读写权限。</strong></span></p>
<h2>范例</h2>
<p>从开心网的群共享页面http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=450163&#038;start=0下载附件xmlData.tar.gz，解压后，将xmlData目录下的所有文件拷贝到http根目录下，然后执行：</p>
<pre>./gen_cont.sh $HOME/dbxml-2.5.13/install/bin/dbxml</pre>
<p>脚本即会生成一个容器：simple.dbxml。该容器内包含三百多个xml文档，形如：</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;产品&gt;
    &lt;种类&gt;fruits&lt;/种类&gt;
    &lt;商品&gt;Avocado&lt;/商品&gt;
    &lt;存货&gt;
        &lt;库存量单位&gt;AvocfruijfHs18&lt;/库存量单位&gt;
        &lt;价格&gt;0.24&lt;/价格&gt;
        &lt;存货&gt;393&lt;/存货&gt;
    &lt;/存货&gt;
    &lt;厂家&gt;Simply Fresh&lt;/厂家&gt;
&lt;/产品&gt;</pre>
<p>使用浏览器访问服务器上的simple.php页面，即可看到转换后输出的数据表。simple.php的内容如下：</p>
<pre>&lt;html&gt;
&lt;body&gt;
&lt;?
$contName = 'simple.dbxml'; // Container名字

// 创建Manager和Context
$mgr = new XmlManager();
$qc = $mgr-&gt;createQueryContext(); // Query Context
$qc-&gt;setDefaultCollection($contName); // 设置默认Container

// 打开Container
$cont = $mgr-&gt;openContainer($contName);

// 创建XQuery查询表达式，将数据提取出来并转换为html表格
$query = 'for $产品 in collection()/产品';
$query .= ' return &lt;tr&gt;';
$query .= '&lt;td&gt;{$产品/种类/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/商品/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/存货/价格/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/存货/存货/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/厂家/string()}&lt;/td&gt;';
$query .= '&lt;/tr&gt;';

// 输出表格头
?&gt;&lt;table width='100%' border='frame'&gt;
&lt;tr&gt;&lt;td&gt;种类&lt;/td&gt;&lt;td&gt;商品&lt;/td&gt;&lt;td&gt;价格&lt;/td&gt;&lt;td&gt;存货&lt;/td&gt;&lt;td&gt;厂家&lt;/td&gt;&lt;/tr&gt;&lt;?

// 查询并遍历结果，输出到表格
$results = $mgr-&gt;query($query, $qc);
while ($results-&gt;hasNext())
echo $results-&gt;next()-&gt;asString();

// 输出表格尾
?&gt;&lt;/table&gt;&lt;?
?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>可见，只需30余行的代码就能完成xml数据库到网页表格的转换。例图：<br />
<img src="http://www.bdbchina.com/wp-content/uploads/2009/10/bdb_xml_php_web.png" alt="bdb_xml_php_web" title="bdb_xml_php_web" width="500" height="500" class="alignnone size-full wp-image-641" /></p>
<h2>总结</h2>
<p>至此，我们已经介绍了BDB XML PHP的安装和使用。至于更多BDB XML功能，如二进制元数据、环境、事务、排序、索引等，请关注后续文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
Դ
