您的位置:首页 > 编程语言 > Java开发

Java之BerkeleyDB(一)

2013-11-10 02:55 253 查看
由于最近在学习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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息