`
eyesmore
  • 浏览: 364797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Berkeley DB JAVA Edition入门

阅读更多

 

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();

	}

}
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics