【IT168技术】本文针对Oracle Berkeley DB 5.2版本,从以下几个方面做详细介绍:Android平台编译过程、ADO.NET开发包、SQL HA的主从复制的工作原理、SQL HA的使用语法和示例。
在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库以获取更高的存储和并发性能。
Android编译过程
下面将提供Berkeley DB Drop-in方式的Android编译指令。
首先要下载并且编译Android源代码树。
第一次编译过程需要花费较长一段时间,不过后面再编译就快多了。可以从这里下载Android的源代码并且按照Android文档完成编译过程。
把Berkeley DB代码目录拷到Android的代码目录里面:
$ tar zxvf db-xx.tar.gz
这里的${root}指的是Android源代码树的根路径。
通过以下命令将源代码树中默认的Android.mk文件替换成Berkeley DB的版本:
$ mv Android.mk Android.mk.sqlite
$ cp db-xx/build_android/Android.mk ./
提示:编译之前,可通过这里查看Android平台上的几种调优参数。
重新编译数据库部分,这样Berkeley DB就替换到最终生成的系统镜像了:
$ . build/envsetup.sh
$ make clean-libsqlite
$ mmm -B external/sqlite/dist
$ make snod
以上指令完成后,新的基于Berkeley DB SQL的Android系统镜像即编译完毕。系统会打印出新的镜像所在目录,一般来说这个目录是:${root}/out/target/product/generic。
Berkeley DB 5.2: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, 属性->部署->远程目录
按需定义部署目录。这里为了方便演示下面的测试,将目录设定为:
%CSIDL_PROGRAM_FILES%\testce
确定保存后,再次右键选择SQLite.Interop.2008.WinCE,选择部署。稍等一会后,当VisualStudio输出窗口显示以下内容,表明仿真器已经启动
========== 部署: 成功1 个,失败0 个,跳过0 个==========

同样的部署System.Data.SQLite.Compact.2008, 按下图所示选择仿真器

右键选择testce.2008, 调试,启动新实例。如上图选择仿真器。测试集会自动运行,这些内置的ADO.NET测试同时也是很好的范例。运行结果如下所示(在仿真器中可用方向键对结果翻页):

BDB数据库内核的主从复制(BDB HA)工作原理
Oracle Berkeley DB 11gR2 5.2版本(下文简称BDB 5.2)在SQL接口层引入一个关于高可用(HA)的新功能,即可以通过PRAGMA配置和启动在多个节点上运行SQL数据库集群的实例,从而通过scale-out的办法将数据库读操作能力扩展到多机上。这一机制的内部原理是使用底层BDB数据库内核的主从复制(即replication)机制。
BDB HA提供主从节点复制,以在分布式系统中提供高可用性和水平读扩展性。每个BDB HA组由单个master节点和多replica节点组成,并提供自动容错切换,其中master提供读写服务,replica节点上提供读服务。Replica为了和master保持数据一致,它会从master或者其他(和master同步的)replica上获得事务日志,并将数据库事务在本地数据库“重演”(replay)。因此,不论master还是replica,所有节点都保留一份当前HA组master上的数据文件和日志。下图1解释BDB的主从复制工作原理。

▲BDB HA 工作原理
任何HA组有且只能有一个master。启动一个新的HA组前,先显式指派某个节点为master。此后,后续加入的节点都是replica节点。运行过程中,当master被关或者网络不可连接时,该HA组剩余节点将投票选举出新的master,此后,旧master再次加入该HA组时,只能以只读replica的方式进入。
在一个由n个节点构成的HA组中,通过选举产生master,最简单的方式是任何一个参与者投票给它认为拥有最多最新数据的节点,此时,获得半数以上(n/2+1)投票的节点将成为新的master。如果一个HA组无法选举出一个master,该HA组将只能提供读(即查询)服务,不能做数据写操作(如增、删、改)。
感兴趣的同学可以去了解一下分布式消息一致性和投票算法,如paxos,请参见参考文档。
SQL层的主从复制(SQL HA)的工作原理
BDB SQL接口在5.2版本之前仅支持单节点的扩展性,通过SQL语句管理和操作数据库。在BDB 5.2版本中,BDB SQL引入多机扩展的功能(即HA,又叫主从复制的高可用),提供分布式多机环境下的SQL数据库集群功能。因此SQL HA为数据库提供更强大的读操作能力和更高的数据库服务可用性(即高可用)。
BDB 底层HA机制中,每个节点都是拥有唯一主机名和端口组合的BDB环境(可以看成是一个关系型数据库实例),而一个BDB环境可以有多个数据库(可以看成是关系型数据库的二维表)。而在SQL HA中,每个节点是拥有唯一主机名和端口组合的BDB数据库,每个数据库拥有各自的BDB环境。与BDB 底层HA机制略有不同的是,SQL HA里的复制粒度是单个数据库表(BDB里面称之为数据库),这个粒度比前者更细。如下图2所示:

▲BDB SQL HA架构示意图
SQL HA的使用语法
你可以通过BDB SQL层的PRAGMA指令来配置高可用的相关参数并启动集群。以下是相关的语法:
①启动和关闭HA:PRAGMA replication=ON|OFF
该语句必须在BDB SQL创建或重建数据库之前设置。在此之前,应先设置本地节点的地址和端口,以及本地节点是否是master,如果不是,则应设置一个远程节点的地址和端口。当HA初始化之后,可以关闭replication,但是它仅在下一次重开这个环境的时候起效。
②设置本地节点是否master:PRAGMA replication_initial_master=ON|OFF
该语句只能在初次创建一个HA时使用,本地节点是这个新的HA的第一个节点,其master的角色不是无限期的,当master掉线时,master的角色有可能转移到其后进入HA的节点上。
③ 设置本地节点的地址和端口:PRAGMA replication_local_site=”hostname:port”
④设置远程节点的地址和端口:PRAGMA replication_remote_site=”hostname:port”
当加入一个已存在的HA时,本地节点需要知道一个在线的远程节点,以帮助其进入HA。
⑤ 设置被删除节点的地址和端口:PRAGMA replication_remove_site=”host:port”
永久地删除HA中的一个节点。与暂时掉线或者被关闭的节点不同,HA的任何一个有效节点都不再记录该节点,即HA中的节点数量减一。
⑥ 设置是否输出HA相关日志信息:PRAGMA replication_verbose_output=ON|OFF
⑦ 设置HA相关日志信息的输出文件:PRAGMA replication_verbose_file=filename
如何在BDB SQL的命令行工具中配置和运行一个三个节点的HA
①配置首个节点,即master
dbsql univ.db
pragma replication_local_site="localhost:10001";
// 指定为该组的master
pragma replication_initial_master=ON;
// 启动replication
pragma replication=ON;
② 加入第二个节点
dbsql univ.db
pragma replication_local_site="localhost:10002";
// 指定一个在线节点
pragma replication_remote_site="localhost:10001";
pragma replication=ON;
③在第一个节点上插入数据
④ 在第二个节点查询数据
⑤ 加入第三个节点
pragma replication_local_site="localhost:10003";
// 第一个或者第二个节点都可以成为第三个节点的远程节点
pragma replication_remote_site="localhost:10002";
pragma replication=ON;
⑥ 在第三个节点删除第二个节点
CREATE TABLE university (
rank int,
name varchar(75),
domains varchar(75),
country varchar(30),
region varchar(30),
size int,
visibility int,
rich int,
scholar int
);
第二个节点被删除后,将不再获得第一个节点上的数据更新。
⑦第三个节点设置不启动replication,并重新启动第三个节点
.quit
dbsql univ.db
关闭之后的所有HA数据更新都不会再应用到第三个节点上,该节点变成单机数据库,可进行读写操作。