Oracle Berkeley DB 产品家族介绍
Oracle Berkeley DB最先由加州大学伯克利分校为了移除受到AT&T限制的dbm代码,而从BSD 4.3到4.4时所改写的。经过将近二十年的衍化,目前Oracle Berkeley DB家族已经发展到包含4个独立产品线 – Berkeley DB、Berkeley DB Java 版、Berkeley DB XML和Mobile Server,被应用到行行业业,在全球有超过2亿的部署。
本文将分别介绍Oracle Berkeley DB四大产品线的特点以及应用,希望能对中国市场的新老用户有所启发和帮助。
1. Oracle Berkeley DB数据库产品系列
Oracle Berkeley DB 产品家族目前有三大数据库产品,分别是:Berkeley DB,Berkeley DB XML 和 Berkeley DB Java Edition。它们的关系和系统架构可以参照图一。下面我将分别进行介绍。
1.1 Berkeley DB
Berkeley DB 也称 Core(下文都以此简称),是Berkeley DB家族第一个发布的产品。Core的核心代码全部由C语言写成,同时提供其他多种语言的应用程序接口(包括 C++, C#, Java, Perl, Python, PHP, Tcl, Ruby等等)。Core有以下一些特点(请大家注意,下面列举的大部分特点其实是Berkeley DB家族所有产品的共同特点):
- 基于Key/Value的存储:对于Core以及Berkeley DB其他产品来说,用户可以任意定义所存储数据的键(key)以及对应的值(value),这样的数据存储方式具有很好的灵活性和多样性。也是由于这个特点,Berkeley DB产品家族被业界归为非关系型(non-relational)数据库。
- 嵌入式数据管理:这里的嵌入式跟大家平时提到的嵌入式有点不一样。这里的嵌入式的意思是指,Core是作为库(library)的形式直接嵌入到用户的应用程序当中,和用户程序运行到同一地址空间,用户选择适当的API进行编程调用。这样“嵌入式”的最大好处就是不需要人为进行管理(即不需要专门的DBA),并可以大大提高程序开发的周期,和降低程序后期的维护成本。
- 体积(footprint)小:由于Core是直接嵌入应用程序当中,所以产品的体积必须越小越好。目前,Core的体积只有1M左右,这意味着,即使对于移动设备(如手机)来说,Core也可以十分轻松嵌入到你的程序中。
- 几乎具备数据库的所有功能和特性:对于这么小体积的数据库,你也许会问,Core会不会丧失很多数据库的特性呢。恰恰相反,在保持小体积的优势下,Berkeley DB几乎具备数据库的所有特性,包括:ACID,事务性(transaction),错误恢复(failure recover),高并发性(high concurrency)等等。
- 高可用性(high availability,简称HA):高可用性一方面可以提高数据读取性能,另一方面是具备自动错误恢复(automatic failover)功能,使数据存储更加安全可靠。
- 高性能:Core拥有极高的数据存取性能,并且用户可以根据机器的配置进行调优。具体性能测试可以参考文档 Oracle Berkeley DB:Performance Metrics and Benchmarks。
尤其需要指出的是:最新版本的Oracle Berkeley DB(11gR2)的一个引人瞩目的特性就是我们引入了对SQL 92标准的支持(见图一红色圆圈部分)。Oracle Berkeley DB SQL接口完全兼容SQLite原有的编程接口, 从而以往运行在SQLite上的程序和应用都可以无缝的、方便的迁移到Oracle Berkeley DB这个更加强大的存储引擎。并且,Oracle Berkeley DB和SQLite还将进行长期的官方层面的合作,保证了Oracle Berkeley DB的SQL接口和SQLite保持一致,免除了用户的后顾之忧。此外,Berkeley DB SQL接口完美支持很多第三方的SQLite工具,如JDBC,ODBC,FireFox 3及其SQLite Manager 插件等。更多有关DBSQL的技术细节,可以参考本站另外一篇博客《Oracle Berkeley DB 支持SQL啦》。
也许有人会问:何时该选用BDB的Key/Value的选项,何时该选用BDB的SQL接口呢?
- 简单的来理解,BDB的Key/Value的选项是一个本地持久化的“HashTable”,可以存取任何数据类型(声音、视频、图像、Java对象等),通过简单的put/get/delete接口来操作。简单的数据访问方式、不需要太多复杂的统计和分析计算的场合都可以使用。比如,微博客的底层数据管理;如果再和hadoop集成后,还可以做一些复杂的分析功能。
- 当使用场合需要轻量级的数据库、有SQL支持、要求高性能和高并发;或者需要和企业端的Oracle 数据库(如Oracle 11g)进行双向的数据同步时,建议可选用Oracle Berkeley DB的SQL接口。举例来说,手持设备/平台上(如Android,Windows Mobile、iPhone等)。
更多关于Core的信息,可以参考下面相关链接:
- Core下载
- Core相关文档
- Core FAQ (可以在此找到常见问题答案)
- Core官方论坛 (在此论坛提出技术问题,会得到Berkeley DB组资深工程师的回答,当然,提问必须是英文。)
- Core HA官方论坛
1.2 Berkeley DB XML
Berkeley DB XML是基于Core数据存取之上,专门用于存取XML文档的数据库(如图一所示),简而言之,Berkeley DB XML以Core作为存储引擎,在此基础上建立对XML文档进行管理、索引和查询优化模块,并提供相应的XML 标准的API。因为Berkeley DB XML建立在Core之上,所以除了具备Core的大部分特点之外,还有以下针对XML文档的一些特点:
- 支持XQuery 1.0 and XPath 2.0。
- 十分灵活的索引功能:Berkeley DB XML支持节点(node),element(元素),attribute(属性)和元数据(meta-data)索引。这样灵活的索引可以极大提高查找性能,特别是针对存取较大的XML文件。
- 支持对XML文档的修改
更多关于Berkeley DB XML的信息,可以参考下面相关链接:
1.3 Berkeley DB Java Edition
Berkeley DB Java Edition(以下简称JE)是Berkeley DB产品家族另外一个独立的产品,也就是说,它并不像BDB XML一样基于BDB Core。JE 除了具备上述 Core 的特点(K/V存储、体积小、性能高以及高可用性(HA)等等)之外,还有以下特色:
- 纯java,简单易用:JE 是纯java语言编写的,意味着JE可以无缝运行于任何java环境。用户只需要在应用程序中包含JE的jar文件,便可调用JE的API进行编程,无需任何额外配置工作。
- 更高的并发性,更高的性能:相对于Core,由于JE提供基于“记录”级别(record level,一条记录由Key和Value组成)的锁,所以JE拥有更高的并发性以及更高的读写性能。关于JE的性能测试,可以参考文档:
- Java对象存储:JE 利用直接持久层(Direct Persistence Layer,DPL) 可以十分方便、灵活、快速存取用户定义的任意java对象。可参考文档Direct Persistence Layer for Berkeley DB Java Edition。
- 适用于J2EE:JE 提供对Java Transaction API (JTA), J2EE Connector Architecture (JCA) 和 Java Management Extensions (JMX)的支持。
更多关于JE的信息,可以参考下面相关链接:
1.4 应用举例
概括而言,你需要一个数据存取的产品,并要满足:
- 性能要求高,相应时间短、占用资源少的场合
- 方便管理,不需要DBA
- 数据访问方式是简单的,任何类型的数据
- 运行于普通硬件平台,随着业务增长可以水平扩展
- 高可用集群和容错备份
可能的应用场景包括:
- 搜索及内容管理
- 缓存及日志模块
- SOA及Web Service的相关模块
- 资源、系统或者仪器管理
- 存储设备
- 网关、网络设备、网络计费系统等
- 消息队列、工作流等系统
- 授权及身份管理
- 仪器、终端和手持设备
举例而言:
- 某全球知名电子商务公司,选择Core作为中间层的静态数据缓存。当用户浏览产品页面的时候,所有的产品信息、价格、用户评价等等数据都是先从Core进行读取。这样可以大大提高页面的显示时间,从而增进用户购物体验。同时还利用Core来管理购物车和交易结算等。
- 某全球著名互联网公司,利用Core HA存取数亿用户的账户信息。Core HA的高性能、高并发性和高可用性满足了此互联网公司对用户登录功能的苛刻要求,包括极短的登录请求响应时间,24×7的无间断服务,高达十亿级别的扩展性,以及极高的可靠性。
- 比如某知名手机公司推出的智能手机选择Berkeley DB SQL作为其底层数据库。某知名POS机厂商也选择 Berkeley DB SQL接口作为新推出的某款POS机的存储引擎。
- 某全球连锁酒店选择Berkeley DB XML来实现在线预定和销售系统。
- 某大型跨国企业选择Berkeley DB XML里进行资产和仪器管理。
- 很多全球型的金融公司的交易系统和底层基础架构的数据存取模块中选择Berkeley DB及Berkeley DB JE。
- 军方的战场实施动态监控系统选择Berkeley DB JE。
- 若干全球知名的社交网站中选择Berkeley DB JE构建上千个节点的云计算方案。
- 某全球知名的网络服务商的视频点播、短信/邮件、视频电话等系统中。
2. Oracle Berkeley DB 11gR2 + Mobile Server
Oracle Berkeley DB 11gR2 + Mobile Server 可以提供移动数据同步解决方案。Oracle Mobile Sync Server(以下简称为Mobile Server)是一个提供企业级移动解决方案的中间层(middle-tier infrastructure)。它的一端连接的是客户端数据库,另外一端连接的是Oracle数据库。Mobile Server主要提供以下功能:
- 应用程序统一部署和配置。比如,应用Mobile Server方案的移动设备都可以自动实现软件的安装、更新和打补丁等等配置,这一过程不需要用户的过多参与。
- 移动设备统一管理。管理员可以远程收集众多移动设备的信息,同时也可以进行统一的操作与部署。比如,管理员可以远程向丢失的移动设备进行额外加密或者销毁设备中的数据。
- 移动设备与Oracle数据库的数据双向同步。与Oracle数据库的同步功能可以保持移动设备的完整性和及时性,并且不要求移动设备时刻与Oracle数据库保持连接。
在Oracle Berkeley DB 11gR2之前,Mobile Server支持的客户端数据库是Oracle Database Lite Client。往后Oracle Berkeley DB 11gR2 会是Mobile Server客户端数据库的推荐选择,而原来的Oracle Database Lite Client将停止新功能开发。因为Berkeley DB 11gR2安装更加简单,性能更加优越,并且体积更小。Berkeley DB 11gR2 + Mobile Server的总体架构图如图二所示。
Oracle Mobile Server 的应用举例:
- 某国的海岸卫队的舰船上的数据同步和设备管理。
- 某大型的博彩机构的手机订单系统。
- 某国海关的缉私等设备上。
- 某大型快速消费品公司的自动售货机上。
更多关于Oracle Mobile Sync Server的信息,可以参考下面相关链接:
列、SOA事件管理和监控、网站缓存等)
- 方便管理,不需要dba (如仪器、设备,像手机,汽车、医疗设备等)
- 数据管理/访问方式是简单的,面向对象的 (如Twitter, facebook等,只需要
简单、高效的插入和删除操作;不需要很多复杂的分析和统计功能)
- 运行于普通硬件平台,随着业务增长可以水平扩展的 (如云计算、金融系统等)


我想问一下,有没有 C#接口来操作Berkeley DB SQL数据库, 在自带的example中,我有看到C和C++ 接口,没有看到C# 接口. Thanks
@belcon
非常好的问题。对,有针对Berkeley DB SQL数据库的C#接口,叫System.Data.SQLite。
System.Data.SQLite (http://sqlite.phxsoftware.com/) 是一个第三方的基于SQLite的ADO.NET Provider, 因为Berkeley DB SQL完全兼容SQLite的接口,所以这套Provider也可以工作在Berkeley DB SQL上。
请下载源码包,将其中的sqlite3.c替换成为BDB的sqlite3.c, 并重新编译工程即可得到一个以BDB为底层引擎的System.Data.SQLite库。你可以通过这个库提供的ADO.NET接口来操作BDB。
对于高并发的使用,即多读多写的情况,是选用CDS还是TDS对高并发的性能更好?
对于这个问题,我看了文档以及oracle的论坛,始终没有解决心里的疑云。
一个具体的应用,比如作为BBS的数据库,多线程操作,同一时间点可能有多人看贴(读数据库),多个发帖(写数据),从BDB的解释上对于CDS的描述,好像在同一个时间点,只能有一个读或者有多个写,按我的理解,这就意味着如果有人在发帖,那么任何一个人在该时间点看贴,任何一个其他人想发帖都会被阻止住,同样,如果有人在发帖,那么任何想看贴的人也会被阻止,那我是不是只能选择TDS才能满足高并发的高性能要求呢?
谢谢
@tiplip
你这个问题很好。BDB的Key-Value接口提供DS, CDS和TDS三种不同的选择。具体来说,DS是提供了基本的Data Store的功能(比如:同一时间单个写操作和单个读操作);CDS提供了锁机制,因此支持并发(单个写操作和多个读操作);而TDS则提供了事物,从而支持多个读和写操作,并且有事物ACID的好处。不同的场合可以选择不同的选项,当然他们的授权/价格也不一样。
关于DS, CDS和TDS的具体区别请参考文档 – http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/intro_products.html.
我在做prefuse的项目,但是没怎么入门。请问如果我想从数据库中任意抽取数据,然后再用prefuse提供的demos来显示这些数据的结构。应该怎么做?能不能写一下全面的代码?拜托了!急
@哈哈哈
这个不是BDB的范畴。你可以去找prefuse的工程师咨询。