嵌入式数据库Berkeley DB Java Edition
Berkeley DB的使用
使用Berkeley DB的一般步骤如下:
第一,创建数据库环境Environment
创建一个Environment环境,首先需要设置一个配置对象DatabaseConfig,用来配置一个数据库的环境,然后就可以创建Environment环境:
EnvironmentConfig envConfig = newEnvironmentConfig(); // 创建一个EnvironmentConfig配置对象
envConfig.setAllowCreate(true); // 允许创建一个数据库环境
envConfig.setCacheSize(1000000); // 设置数据库缓存大小
try {
Environment env = new Environment(newFile("D:\\"),envConfig); // 使用一个指定路径和一个EnvironmentConfig配置对象创建Environment环境
} catch (DatabaseException e){
e.printStackTrace();
}
第二,打开数据库Database
首先需要在一个已经存在的Environment环境下考虑打开一个数据库;
打开数据库之前,也要创建一个DatabaseConfig配置对象,用来配置一个Database;
使用Environment环境来打开数据库Database。
在上面步骤中创建了env的基础上,打开数据库具体实现如下:
DatabaseConfig dbConfig = newDatabaseConfig(); // 创建一个DatabaseConfig配置对象
dbConfig.setAllowCreate(true); // 允许创建数据库
try {
Database db = env.openDatabase(null, "MyBDB",dbConfig); // 打开数据库MyBDB
} catch (DatabaseException e) {
e.printStackTrace();
}
第三,操作数据库
Berkeley DB存储的是键值对形式的数据,其实类似于一个Map,无非是向数据库中添加key/value对,或者根据指定的key取出对应的value,这是最基础的。
还可以使用游标来遍历数据库中的记录。
第四,关闭数据库及其环境
关闭的顺序就是:先关闭数据库,然后关闭环境:
try {
if(db != null) {
db.close();
}
if(env != null) {
env.close();
}
} catch (DatabaseException e) {
e.printStackTrace();
}
Berkeley DB实例
下面做了一个例子,实现了MyBerkeleyDB类,用来演示如何使用一个Berkeley DB:
写入数据
package org.shirdrn.berkeleydb;
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 mbdb = new MyBerkeleyDB();
mbdb.setUp("C:\\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.close();
}
可以看到控制台上打印出:
开始向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]
也就是,想数据库中插入了20个键值对。
读取数据
在此基础上,我们可以打开这个数据库,从其中取出想要的键值对,根据key来取出value,修改main方法:
public static void main(String[] args) {
MyBerkeleyDB mbdb = new MyBerkeleyDB();
mbdb.setUp("C:\\bdb", 1000000);
mbdb.open("myDB");
while(true) {
try {
for(int i=0; i<1000; i++) {
System.out.println("从Berkeley DB中取出数据...");
String k = "myKey" + 2*i;
String v = mbdb.get(k);
System.out.println("[" + k +":" + v +"]");
Thread.sleep(3000);
if(i == 20) {
mbdb.close();
System.exit(0);
}
}
Thread.sleep(300000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印出结果如下所示:
从Berkeley DB中取出数据...
[myKey0:myValue0]
从BerkeleyDB中取出数据...
[myKey2:myValue2]
从BerkeleyDB中取出数据...
[myKey4:myValue4]
从BerkeleyDB中取出数据...
[myKey6:myValue6]
从BerkeleyDB中取出数据...
[myKey8:myValue8]
从BerkeleyDB中取出数据...
[myKey10:myValue10]
从BerkeleyDB中取出数据...
[myKey12:myValue12]
从BerkeleyDB中取出数据...
[myKey14:myValue14]
从BerkeleyDB中取出数据...
[myKey16:myValue16]
从BerkeleyDB中取出数据...
[myKey18:myValue18]
从Berkeley DB中取出数据...
[myKey20:null]
从BerkeleyDB中取出数据...
[myKey22:null]
从BerkeleyDB中取出数据...
[myKey24:null]
可以看到,我们只存储了[myKey0:myValue0]到[myKey19:myValue19],而打印出结果[myKey20:null]对应的value都为null,说明不存在指定的key。
删除数据
在上面的类中增加如下成员方法:
public boolean delete(String key) throws Exception {
byte[] theKey = key.getBytes("UTF-8");
OperationStatus status = db.delete(null, newDatabaseEntry(theKey));
if(status == OperationStatus.SUCCESS) {
return true;
}
return false;
}
用来删除指定的key及其对应的额value。
修改主函数,测试:
public static void main(String[] args) {
MyBerkeleyDB mbdb = new MyBerkeleyDB();
mbdb.setUp("C:\\bdb", 1000000);
mbdb.open("myDB");
try {
mbdb.delete("myKey0"); // 删除myKey0及其对应的myValue0
} catch (Exception e1) {
e1.printStackTrace();
}
while(true) {
try {
for(int i=0; i<20; i++) {
System.out.println("从Berkeley DB中取出数据...");
String k = "myKey" + i;
String v = mbdb.get(k);
System.out.println("[" + k +":" + v +"]");
Thread.sleep(3000);
}
mbdb.close();
System.exit(0);
Thread.sleep(300000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
从Berkeley DB中取出数据...
[myKey0:null]
从BerkeleyDB中取出数据...
[myKey1:myValue1]
从BerkeleyDB中取出数据...
[myKey2:myValue2]
从BerkeleyDB中取出数据...
[myKey3:myValue3]
可以看到,myKey0对应的myValue0为null,已经从数据库中删除了,其实该键值对已经不存在于该数据库中了。
修改数据
其实,就是重新写入存在的一个key及其修改该key对应的value,如下所示:
public boolean update(String key, String value) throwsException {
byte[] updateKey = key.getBytes("UTF-8");
byte[] updateValue = value.getBytes("UTF-8");
OperationStatus status = db.put(null, newDatabaseEntry(updateKey), new DatabaseEntry(updateValue));
if (status == OperationStatus.SUCCESS) {
return true;
}
return false;
}
测试主函数:
public static void main(String[] args) {
MyBerkeleyDB mbdb = new MyBerkeleyDB();
mbdb.setUp("C:\\bdb", 1000000);
mbdb.open("myDB");
try {
mbdb.update("myKey0", "yourValue"); // 修改数据
} catch (Exception e1) {
e1.printStackTrace();
}
while(true) {
try {
for(int i=0; i<20; i++) {
System.out.println("从Berkeley DB中取出数据...");
String k = "myKey" + i;
String v = mbdb.get(k);
System.out.println("[" + k +":" + v +"]");
Thread.sleep(3000);
}
mbdb.close();
System.exit(0);
Thread.sleep(300000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如下所示:
从Berkeley DB中取出数据...
[myKey0:yourValue]
在线Berkeley DB Java Edition API:
http://www.oracle.com/technology/documentation/berkeley-db/je/java/index.html
分享到:
相关推荐
### Berkeley DB 教程知识点详解 #### 一、Berkeley DB 概述 Berkeley DB 是一款高性能的嵌入式数据库管理系统,它以其强大的功能、可靠性和灵活性而著称。适用于多种应用场景,如桌面应用程序、服务器后端以及...
在“BerkeleyDB概念”部分,文档会介绍Berkeley DB的基本概念,如BTree和Hash数据库的访问方式选择,以及Queue和Recno之间的选择。 接下来,教程会讨论数据库的限制与可移植性、环境设置、异常处理和错误返回。然后...
本文描述了如何在Berkeley DB中使用事务(Transaction)。它简要介绍了事务是如何保护你的应用的数据的...本书假设你已经了解BerkeleyDB的基本架构知识(这些知识在<Getting Started with Berkeley DB Guide>一书中。)
它通常会提供快速上手的教程,介绍BerkeleyDB的基本概念、安装步骤、基本API的使用,以及如何创建、打开、关闭数据库。此外,还会涉及数据的读写操作、索引创建、数据库备份和恢复等基础操作。 最后,`BerkeleyDB-...
《Berkeley DB数据库C语言入门教程》是一份深入浅出的文档,主要针对希望使用C语言操作Berkeley DB数据库的初学者。Berkeley DB是由Oracle公司开发的一种轻量级、高性能、嵌入式数据库系统,广泛应用于各种软件开发...
《BerkeleyDB:数据库系统的核心技术解析》 BerkeleyDB(简称BDB)是由Oracle公司开发的一款开源、轻量级、嵌入式数据库系统。它以其高效、灵活和可靠的特点,广泛应用于各种软件项目,特别是在分布式系统、网络...
Berkeley-DB-Explorer 一个用于浏览 Berkeley DB 存储库中保存的数据的 Swing 应用程序要使用,请将 utils.Settings.BDBFilesPath 指向包含 bdb 环境的文件夹。 配置 CLASSPATH 以包含所有实体类。 然后运行 gui...
本文主要介绍了关于BerkeleyDB的安装、编译和配置,描述了在目前所知的大多数平台上的安装配置过程。这里只是介绍新安装系统,不包括升级所需的描述。那个需要参考《Berkeley DB Upgrade Guide》一文。 在某些特定...
描述中提到了“超详细Oracle教程”,这可能是一个全面指导用户如何安装、配置和管理Oracle Berkeley DB的教程文档,包含了从基础到高级的所有步骤。这样的教程对于初学者和有经验的DBA都非常有价值,能够帮助他们...
首先,需要安装的软件包有 openssl-0.9.7i.tar.gz、libnids-1.16.tar.gz、libpcap-0.7.2.tar.gz、libnet-1.0.2a.tar.gz、berkeley_db-4.6.21.NC.tar.gz 和 dsniff-2.3.tar.gz。这些软件包都是dsniff 安装的必备组件...
- 配置并安装BerkeleyDB:`../dist/configure --prefix=/usr/local/BerkeleyDB.4.4`,`make`,`make install` - 配置环境变量:在`/etc/ld.so.conf`中添加`/usr/local/BerkeleyDB.4.4/lib`,运行`/sbin/ldconfig`...
Subversion的安装与上述两步类似,先下载Subversion的压缩包,解压后进入目录,使用`./configure`进行配置,其中`--with-berkeley-db`和`--with-apxs`分别指定BerkeleyDB的路径和Apache的apxs工具路径。接着,运行`...
PostgreSQL 8.3 版本的亮点还包括对 Berkeley DB 兼容性的提升,Berkeley DB 是一种嵌入式数据库系统,允许在 PostgreSQL 中使用其数据存储格式。这扩展了 PostgreSQL 的应用场景,特别是在需要轻量级、高性能存储的...
BerkeleyDB是一种极为流行的开源嵌入式数据库,在更多情况下可用于存储引擎,比如BerkeleyDB在被Oracle收购之前曾作为MySQL的存储引擎,由此可以预见,该产品拥有极好的并发伸缩性,支持事务及嵌套事务,海量数据...
SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法、事务、数据表和索引等。...
db-18.1.32.tar.gz可能是Berkeley DB的源码包,这是一款嵌入式数据库,用于存储FastDFS或FastDHT的元数据。在某些情况下,FastDFS可能会依赖于Berkeley DB来存储文件的元信息。 libfastcommon是FastDFS的一个辅助库...
例如,可以通过创建不同的数据库后端(如BERkeley DB,HDB,LMDB等)来优化性能和功能。此外,OpenLDAP还支持多种访问控制策略,可以精细地控制哪些用户或组可以访问目录树中的特定信息。 对于身份验证系统而言,...