BerkeleyDB 是一种 KEY-VALUE 的存储容器,跟 memcached 有些类似。但是 BerkeleyDB 相对于 memcached 的不同在于:( 1 ) BerkeleyDB 不是分布式的,你可以简单的把 BerkeleyDB 理解为本地的一个磁盘文件,只不过 BerkeleyDB 会负责组织这个文件,并从这个文件中快速检索出数据;而 memcached 是可以通过简单的文本协议网络访问的,因此 memcached 数据是存放在 memcached 服务器上的,其他应用程序无论 C,PHP,JAVA 还是 Ruby 都只要通过网络协议就可以访问。( 2 ) BerkeleyDB 的定位是数据库,数据库最重要的是持久化,而 memcached 的定位是 Cache ,因此 memcached 的数据都是存放在内存里面的, memcached 宕机或重启缓存数据丢失是没有关系的,然而 BerkeleyDB 应用场景往往要求数据是持久化的,只不过 BerkeleyDB 的 Hash 索引的效率要比 Mysql 等关系数据库的 B-Tree 索引效率高。
BerkeleyDB 被 Oracle 收购了,我们在 Oracle 站点上会看到: BerkeleyDB ; BerkeleyDB XML 和 BerkeleyDB JAVA Edition 三个东西。简单的说最开始 BerkeleyDB 是只有 C 语言版本的,但是 JAVA 也可以使用,只不过需要通过 JNI 调用,效率可能有点影响。但是 Oracle 不会放弃 JAVA 领域,因此很快就出了 JAVA Edition ,专门用 JAVA 实现了一遍,也就是我们看到的 BerkeleyDB JAVA Edition (简称 JE )。至于 BerkeleyDB XML 可能是专门对 XML 数据的处理方面的,笔者也没看过相关文档。三个东西的下载地址: http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html
下面笔者以 BerkeleyDB JAVA Edition 来写一个 HelloWorld 程序,下载 JE :
berkeleydb java edition: http://download.oracle.com/otn/berkeley-db/je-4.1.10.tar.gz
(你可能需要先在 oracle 站点注册一个账号,并登陆,才能下载)
笔者还是引用别人写的 HelloWorld ,写得很好:
http://blog.csdn.net/tiandiqing/article/details/4337636 或
http://hi.baidu.com/shirdrn/blog/item/28e1573948cffdf43b87ce6e.html
简单来说,BerkeleyDB和Mysql概念上的类比:Mysql的一个server上可以有多个数据库,数据库中有多个表和记录;BerkeleyDB首先指定文件目录,用于存储,这个叫Enviroment,然后在一个Environment中可以定义多个数据库,以名称来区分,这个叫Database,最后就是在Database中存放KEY-VALUE。
package com.eyesmore.bdb.je; import java.io.File; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; import com.sleepycat.je.LockMode; import com.sleepycat.je.OperationStatus; public class MyBerkeleyDB { private Environment env; private Database db; public MyBerkeleyDB() { } /** 构建Environment: 指定存储的文件(一个Environment可以有多个数据库) */ public void setUp(String path, long cacheSize) { EnvironmentConfig envConfig = new EnvironmentConfig(); envConfig.setAllowCreate(true); envConfig.setCacheSize(cacheSize);//The memory available to the database system, in bytes. File dir = new File(path); if(!dir.exists()) {//如果指定的目录不存在,则自动创建 dir.mkdir(); System.out.println("创建目录:"+path); } try { env = new Environment(dir, envConfig); } catch (DatabaseException e) { e.printStackTrace(); } } /** 构建Database: 指定数据库名字,如果指定名字的数据库不存在,则自动创建。*/ public void open(String dbName) { DatabaseConfig dbConfig = new DatabaseConfig(); dbConfig.setAllowCreate(true); try { db = env.openDatabase(null, dbName, dbConfig); } catch (DatabaseException e) { e.printStackTrace(); } } /** 关闭数据库和环境 */ public void close() { try { if (db != null) { db.close(); } if (env != null) { env.close(); } } catch (DatabaseException e) { e.printStackTrace(); } } /**数据操作:写 * BDB存储的数据是无格式的,都是二进制的数据,无论是KEY,还是VALUE。 * 如果我们要存取JAVA对象,需要程序员先序列化成二进制的。 * */ public boolean put(String key, String value) throws Exception { byte[] theKey = key.getBytes("UTF-8"); byte[] theValue = value.getBytes("UTF-8"); OperationStatus status = db.put(null, new DatabaseEntry(theKey), new DatabaseEntry(theValue)); if (status == OperationStatus.SUCCESS) { return true; } return false; } /**数据操作:读 */ public String get(String key) throws Exception { DatabaseEntry queryKey = new DatabaseEntry(); DatabaseEntry value = new DatabaseEntry(); queryKey.setData(key.getBytes("UTF-8")); OperationStatus status = db .get(null, queryKey, value, LockMode.DEFAULT); if (status == OperationStatus.SUCCESS) { return new String(value.getData()); } return null; } /**数据操作:修改 (覆盖写就是修改)*/ public boolean update(String key, String value) throws Exception { byte[] updateKey = key.getBytes("UTF-8"); byte[] updateValue = value.getBytes("UTF-8"); OperationStatus status = db.put(null, new DatabaseEntry(updateKey), new DatabaseEntry(updateValue)); if (status == OperationStatus.SUCCESS) { return true; } return false; } /**数据操作:删除 */ public boolean delete(String key) throws Exception { byte[] theKey = key.getBytes("UTF-8"); OperationStatus status = db.delete(null, new DatabaseEntry(theKey)); if(status == OperationStatus.SUCCESS) { return true; } return false; } public static void main(String[] args) throws Exception { MyBerkeleyDB mbdb = new MyBerkeleyDB(); mbdb.setUp("D:\\bdb", 1000000); mbdb.open("myDB"); // System.out.println("开始向Berkeley DB中存入数据..."); // for (int i = 0; i < 20; i++) { // try { // String key = "myKey" + i; // String value = "myValue" + i; // System.out.println("[" + key + ":" + value + "]"); // mbdb.put(key, value); // } catch (Exception e) { // e.printStackTrace(); // } // } mbdb.put("liwei", "20"); String value = mbdb.get("liwei"); System.out.println(value); mbdb.close(); } }