Java之BerkeleyDB(一)

由于最近在学习SE方面的知识,刚开始就遇到了一个很大的问题,数据存储问题?

随着Crawler抓取的网页越多,我们之前使用Java子带的ArrayList或者HashMap都不够存储,而且速度上也不能够很好满足我们的需要,所以这里推荐使用BerkeleyDB这种基于内存的小型数据库,它是嵌入式数据库,指的是嵌入在应用程序的数据库。


上Oracle官网可以下载到该库。

注意:加入lib的时候,只需要加入je那个jar就好了,反正我把其他也加进来的时候会报错:

java.lang.NullPointerException at com.sleepycat.je.dbi.MemoryBudget.

这种莫名奇妙,让我找来大半天,以致深夜。。。后来改成只加一个库就可以了。。。


推荐大家可以上网查查他的中文手册,有人翻译了,挺快就能够上手的。

首先他需要环境配置EnvironConfig

这个环境配置可以生成我们的环境Environment

然后利用这个环境产生我们的数据库Database

当然也许要数据库配置DatabaseConfig

搞清楚后就很简单了,其他就是一些配置设置问题。


为了以后项目使用,我简单的把该库封装成一个类似hashMap的使用方法

还没有看到游标那块,大家自己在丰富下这个函数就可以了,太晚了。。。困觉。。


import java.io.File;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;

import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;


public class Main {

	/**
	 * @param args
	 */
	static Environment env = null;
	
	public static void main(String[] args) {
		BDBUtil<Integer, Student> bDB = new BDBUtil<Integer, Student>("testDB");
		Student s1 = new Student(1,"ylf");
		Student s2 = new Student(2,"dsb");
		Student s3 = new Student(3,"dbc");
		
		bDB.put(1, s1);
		bDB.put(2, s2);
		bDB.put(3, s3);
		
		Student s = new Student();
		s.fromString(bDB.get(3));
		System.out.println("my name is "+s.getName()+" no is "+s.getNo());
		
		System.out.println(bDB.size());
		bDB.close();
	}

}

/**
 * 我们的BDB工具
 * 目前对外提供添加数据和取得数据,删除数据3个接口
 * 类似HashMap的使用方法
 * 注意:
 * 这里的K 和 V两个类都必须实现来Serializable
 * 而且也实现来toString
 * 使用结束记得调用close()
 * @author ylf
 *
 */
class BDBUtil<K, V>{
	private Environment env = null;
	private EnvironmentConfig envCfig = null;
	private Database db = null;
	private DatabaseConfig dbCfig = null;
	
	private File file = null;
	
	public BDBUtil(String dbName) {
		envCfig = new EnvironmentConfig();
		envCfig.setAllowCreate(true);
		file = new File("./test/");
		env = new Environment(file, envCfig);
		dbCfig = new DatabaseConfig();
		dbCfig.setAllowCreate(true);
		db = env.openDatabase(null, dbName, dbCfig);
	}
	
	public boolean put(K keyStr, V valueStr){
		DatabaseEntry key;
		try {
			key = new DatabaseEntry(keyStr.toString().getBytes("gb2312"));
			DatabaseEntry data = new DatabaseEntry(valueStr.toString().getBytes("gb2312"));
			db.put(null, key, data);
			return true;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public String get(K keyStr){
		DatabaseEntry key;
		String value = "";
		try {
			key = new DatabaseEntry(keyStr.toString().getBytes("gb2312"));
			DatabaseEntry data = new DatabaseEntry();
			if(db.get(null,key,data,LockMode.DEFAULT) == OperationStatus.SUCCESS)
				value = new String(data.getData(),"gb2312");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return value;
		
	}
	
	public boolean del(K keyStr){
		DatabaseEntry key;
		try {
			key = new DatabaseEntry(keyStr.toString().getBytes("gb2312"));
			if(OperationStatus.SUCCESS == db.delete(null, key))
				return true;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	public long size(){
		return db.count();
	}
	
	public void close(){
		db.close();
		env.cleanLog();
		env.close();
	}
}

/**
 * 序列化了的类
 * 实现toString()
 * @author ylf
 *
 */
class Student implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 7333239714054069867L;
	private String name;
	private int no;
	
	public Student() {
	}
	public Student(int no, String name){
		this.no = no;
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	@Override
	public String toString() {
		return "Student"+no+":"+name;
	}
	
	public void fromString(String str){
		int i = str.indexOf(':');
		String noStr = str.substring(7,i);
		this.no = Integer.parseInt(noStr);
		this.name = str.substring(i+1);
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值