嵌入式数据库 java_嵌入式数据库bdb(Berkeley DB Java Edition)

51cto/2023/10/1 4:39:55

关于Berkeley数据库的介绍,可以参考下面的文章:

使用Berkeley DB的一般步骤如下:

第一,创建数据库环境Environment

创建一个Environment环境,首先需要设置一个配置对象DatabaseConfig,用来配置一个数据库的环境,然后就可以创建Environment环境:

EnvironmentConfig envConfig = new EnvironmentConfig(); // 创建一个EnvironmentConfig配置对象

envConfig.setAllowCreate(true); // 允许创建一个数据库环境

envConfig.setCacheSize(1000000); // 设置数据库缓存大小

try {

Environment env = new Environment(new File("D://"),envConfig); // 使用一个指定路径和一个EnvironmentConfig配置对象创建Environment环境

} catch (DatabaseException e) {

e.printStackTrace();

}

第二,打开数据库Database

首先需要在一个已经存在的Environment环境下考虑打开一个数据库;

打开数据库之前,也要创建一个DatabaseConfig配置对象,用来配置一个Database;

使用Environment环境来打开数据库Database。

在上面步骤中创建了env的基础上,打开数据库具体实现如下:

DatabaseConfig dbConfig = new DatabaseConfig(); // 创建一个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:

写入数据

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]

从Berkeley DB中取出数据...

[myKey2:myValue2]

从Berkeley DB中取出数据...

[myKey4:myValue4]

从Berkeley DB中取出数据...

[myKey6:myValue6]

从Berkeley DB中取出数据...

[myKey8:myValue8]

从Berkeley DB中取出数据...

[myKey10:myValue10]

从Berkeley DB中取出数据...

[myKey12:myValue12]

从Berkeley DB中取出数据...

[myKey14:myValue14]

从Berkeley DB中取出数据...

[myKey16:myValue16]

从Berkeley DB中取出数据...

[myKey18:myValue18]

从Berkeley DB中取出数据...

[myKey20:null]

从Berkeley DB中取出数据...

[myKey22:null]

从Berkeley DB中取出数据...

[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, new DatabaseEntry(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]

从Berkeley DB中取出数据...

[myKey1:myValue1]

从Berkeley DB中取出数据...

[myKey2:myValue2]

从Berkeley DB中取出数据...

[myKey3:myValue3]

可以看到,myKey0对应的myValue0为null,已经从数据库中删除了,其实该键值对已经不存在于该数据库中了。

修改数据

其实,就是重新写入存在的一个key及其修改该key对应的value,如下所示:

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

}

}

}

运行


http://www.ngui.cc/51cto/show-392.html

相关文章

error: rpmdb: BDB0113 Thread/process 21537/140635654248512 failed: BDB1507 Thread died in Berkeley D

【问题&#xff1a;yum安装软件 error: rpmdb: BDB0113 Thread/process 21537/140635654248512 failed: BDB1507 Thread died in Berkeley DB library】 【解决办法&#xff1a;重新构建rpm数据库】 //进入文件夹 /var/lib/rpm cd /var/lib/rpm //删除 -rf __db开头的文件 rm …

oracle rac 大表,oracle 11g RAC crfclust.bdb过大的处理

find / -type f -size 500M | xargs du -hm | sort -nrora.crf服务是为Cluster Health Monitor(以下简称CHM)提供服务的&#xff0c;用来自动收集操作系统的资源(CPU、内存、SWAP、进程、I/O以及网络等)的使用情况。由于bug 10165314&#xff0c;ora.crf服务生成的文件($GI_HO…

yum安装提示错误:rpmdb: BDB0113

目录问题解决方法问题 yum安装时&#xff0c;有如下提示 解决方法 重新构建rpm数据库 cd /var/lib/rpm ll rm -rf __db* rpm --rebuilddb

mysql engine 和type_MySQL engine/type类型InnoDB/MYISAM/MERGE/BDB/HEAP的区别

看MySQL参考手册 发现CREATE TABLE 时有多种数据库存储引擎&#xff1a;TYPE {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }网上查了下据说MyISAM、InnoDB两种引擎常用大至区别如下[不知是否准确]&#xff1a;高级处理:MyISAM类型不支持事务处理等高级处理&am…

人脸识别系统在校园的应用场景日益丰富

各类证件、门禁卡、钥匙曾经是高校师生出入校园的必备品&#xff0c;如今在越来越多的高校&#xff0c;师生们只需“刷脸”即可轻松自如享受各种服务。常见的有“刷脸”进校园、进图书馆、进寝室等。作为人工智能领域大规模落地的成熟技术&#xff0c;人脸识别已经被越来越多的…

普歌-Linux中yum update错误/yum install 错误 error: rpmdb: BDB0113 Thread/process 728/140414210832448 failed

【已解决】yum执行命令 error: rpmdb: BDB0113 Thread/process 728/140414210832448 failed 错误截图再现&#xff1a; 错误场景&#xff1a;可能是yum update xxx或yum install xxx 服务器版本&#xff1a;centos 7.x 解决方法 依次输入以下代码 # cd /var/lib/rpm # ls B…

yum报错-rpmdb: BDB0113

一、报错详情 yum包的时候出现报错 二、解决办法 # 进入到对应目录 cd /var/lib/rpm # 删除__db*文件 rm -f __db* 重构yum rpm --rebuilddb

mysql bdb_深入理解mysql之BDB系列(2)---数据元页结构(摘自老杨)

三&#xff1a;数据元页结构3.1 metepage头结构该结构是一个公共结构。用于B树matapage页、HASH的matepage页以及queue的metapage。typedef struct _dbmeta33 {DB_LSN lsn; //LSNdb_pgno_t pgno; //当前页号u_int32_t magic; //调试用的魔数u_int32_t version; //数据库的当前版…

yum 命令执行出现failed: BDB0113....BDB1507 Thread died in Berkeley DB library

error: rpmdb: BDB0113 Thread/process 61227/140631941699392 failed: BDB1507 Thread died in Berkeley DB library问题描述解决方案问题描述 Linux执行yum命令时出现该错误&#xff0c;详情如下&#xff1a; [rootVM-4-17-centos tmp]# yum remove -y docker error: rpmdb…

error: db5 error(-30973) from dbenv->open: BDB0087 DB_RUNRECOVERY: Fatal error, run database recover

yum update快结束时报错&#xff1a; 检查了一下显示rpm库损坏&#xff0c;删除重建修复rpm库 修复完毕&#xff0c;rpm库OK&#xff01;