Berkeley DB是一个开放源代码的内嵌式数据库管理系统,能够为应用程序提供高性能的数据管理服务。应用它程序员只需要调用一些简单的API就可以完成对数据的访问和管理。与常用的数据库管理系统(如MySQL和Oracle等)有所不同,在Berkeley DB中并没有数据库服务器的概念。应用程序不需要事先同数据库服务建立起网络连接,而是通过内嵌在程序中的Berkeley DB函数库来完成对数据的保存、查询、修改和删除等操作。
二、Berkeley DB的使用步骤
1>创建数据库环境类---BdbEnvironment
BDB数据库环境,可以缓存StoredClassCatalog并共享。
创建一个Environment环境,首先需要创建一个DatabaseConfig配置对象,用来配置一个数据库的基本信息,然后通过这个配置项就可以创建Environment环境。
EnvironmentConfig envConfig = new EnvironmentConfig(); // 创建一个EnvironmentConfig配置对象
envConfig.setAllowCreate(true); // 允许创建一个数据库环境
envConfig.setCacheSize(1000000); // 设置数据库缓存大小
envConfig.setTransactional(false);////设置是否支持事务----不支持事务
try {
Environment env = new Environment(new File("D://"),envConfig); // 使用一个指定路径和一个EnvironmentConfig配置对象创建Environment环境
} catch (DatabaseException e) {
e.printStackTrace();
}
2>打开数据库DataBase
首先需要在一个已经存在的Environment环境下考虑打开一个数据库;
打开数据库之前,也要创建一个DatabaseConfig配置对象,用来配置一个Database;
使用Environment环境来打开数据库Database。
在上面步骤中创建了env的基础上,打开数据库具体实现如下:
DatabaseConfig dbConfig = new DatabaseConfig(); //创建一个dbConfig配置对象
dbConfig.setAllowCreate(true); //允许创建数据库
try {
//事务、数据库名、配置项
Database classCatalogDB = openDatabase(null, "classCatalog", dbConfig); //打开数据库classCatalog
} catch (DatabaseException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
3>操作数据库
Berkeley DB存储的是键值对形式的数据,其实类似于一个Map,无非是向数据库中添加key/value对,或者根据指定的key取出对应的value,这是最基础的。
还可以使用游标来遍历数据库中的记录。
Berkeley DB存储的数据形式是以KeyValue键值对,其实就是类似于一个map集合,就是存储的容器是一个数据库,其实实质操作跟操作map没有区别,无非就是根据key取出value值。对数据库的信息进行CURD。
主要的方法:offer,peek,poll,remove,addAll,AbstractQueue
4>关闭数据库以及环境
关闭的顺序:先关闭数据库,再关闭配置环境。防止数据丢失。
try {
if(queueDb!=null){
queueDb.sync();//将数据持久化到数据库
queueDb.close();//关闭数据库
}
if(env != null) {
env.close(); //关闭配置环境
}
} catch (DatabaseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
三、Berkeley DB 案例
下面创建一个MyBerkeleyDB,用来测试数据库的使用。
/**
* @author Mr.lu
* @Title: MyBerkeleryDB
* @ProjectName DocCloud
* @Description: TODO
* @date 2018/11/6:21:18
*/
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() {
}
public void setUp(String path, long cacheSize) {
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
envConfig.setCacheSize(cacheSize);
try {
env = new Environment(new File(path),envConfig);
} catch (DatabaseException e) {
e.printStackTrace();
}
}
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();
}
}
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 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 static void main(String[] args) {
MyBerkeleyDB mybdb = new MyBerkeleyDB();
mybdb.setUp("D://mbdb", 1000000);
mybdb.open("mbdb");
System.out.println("开始向Berkeley DB中存入数据...");
for(int i=0; i<20; i++) {
try {
String key = "Key-"+i;
String value = "Value-"+i;
System.out.println("[" + key + ":" + value + "]");
mybdb.put(key , value);
} catch (Exception e) {
e.printStackTrace();
}
}
mybdb.close();
}
}
在控制台中的信息-向数据库中存储了20个key-value键值对
开始向Berkeley DB中存入数据...
[Key-0:Value-0]
[Key-1:Value-1]
[Key-2:Value-2]
[Key-3:Value-3]
[Key-4:Value-4]
[Key-5:Value-5]
[Key-6:Value-6]
[Key-7:Value-7]
[Key-8:Value-8]
[Key-9:Value-9]
[Key-10:Value-10]
[Key-11:Value-11]
[Key-12:Value-12]
[Key-13:Value-13]
[Key-14:Value-14]
[Key-15:Value-15]
[Key-16:Value-16]
[Key-17:Value-17]
[Key-18:Value-18]
[Key-19:Value-19]
Process finished with exit code 0
在文件夹中的情况
在上面的基础上,将数据库中的数据读取出来。
public static void main(String[] args) throws Exception {
MyBerkeleyDB mbdb = new MyBerkeleyDB();
mbdb.setUp("D://mbdb", 1000000);
mbdb.open("mbdb");
System.out.println("从Berkeley DB中取出数据...");
for (int i = 0; i <= 20; i++) {
String k = "myKey" + i;
String v = mbdb.get(k);
System.out.println("[" + k + ":" + v +"]");
}
mbdb.close();
}
可以看到控制台打印的信息中--只有key-value:0~19个键值对数据不为空。表示上面写入正确
从Berkeley DB中取出数据...
[myKey0:myValue0]
[myKey1:myValue1]
[myKey2:myValue2]
[myKey3:myValue3]
[myKey4:myValue4]
[myKey5:myValue5]
[myKey6:myValue6]
[myKey7:myValue7]
[myKey8:myValue8]
[myKey9:myValue9]
[myKey10:myValue10]
[myKey11:myValue11]
[myKey12:myValue12]
[myKey13:myValue13]
[myKey14:myValue14]
[myKey15:myValue15]
[myKey16:myValue16]
[myKey17:myValue17]
[myKey18:myValue18]
[myKey19:myValue19]
[myKey20:null]
Process finished with exit code 0