`
rensanning
  • 浏览: 3540135 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38001
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:606575
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:681277
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:88800
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401340
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69576
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91447
社区版块
存档分类
最新评论

Java嵌入式NoSQL数据库之Berkeley DB Java Edition

    博客分类:
  • Java
 
阅读更多
一个通用的事务保护,100%纯Java编写的嵌入式NoSQL数据库,采取开源(免费)和商用(付费)的双License的授权模式。Berkeley DB是历史悠久的嵌入式数据库系统,06年被 Oracle 收购,而Berkeley DB Java Edition是Berkeley DB产品中的一部分。

引用
Berkeley DB Java Edition is a open source, transactional storage solution for Java applications. The Direct Persistence Layer (DPL) API is faster and easier to develop, deploy, and manage than serialized object files or ORM-based Java persistence solutions.  The Collections API enhances the standard java.util.collections classes allowing them to be persisted to a local file system and accessed concurrently while protected by ACID transactions. Data is stored by serializing objects and managing class and instance data separately so as not to waste space. Berkeley DB Java Edition is the reliable drop-in solution for complex, fast, and scalable storage.


http://www.oracle.com/technetwork/products/berkeleydb/downloads/index.html

版本:Berkeley DB Java Edition 5.0.73.zip

(1)打开Database环境
EnvironmentConfig envCfg = new EnvironmentConfig();
//当数据库环境不存在的时候,创建一个数据库环境,默认为false.
envCfg.setAllowCreate(true);
//以只读方式打开,默认为false.
envCfg.setReadOnly(false);
//事务支持,默认为false.
envCfg.setTransactional(true);

Environment mydbEnv = new Environment(new File(envHome), envCfg);

System.out.println("Env Config: " + mydbEnv.getConfig());


(2)打开Database
DatabaseConfig dbCfg = new DatabaseConfig();
dbCfg.setAllowCreate(true);
dbCfg.setReadOnly(false);
dbCfg.setTransactional(true);

Database mytestdb = mydbEnv.openDatabase(null, "VendorDB", dbCfg);
	
System.out.println("Database Name: " + mytestdb.getDatabaseName());


(3)简单的CRUD
//C
String key = "key-rensanning";
String value = "This is a test!(000)";

DatabaseEntry keyEntry = new DatabaseEntry(key.getBytes("utf-8"));
DatabaseEntry valEntry = new DatabaseEntry(value.getBytes("utf-8"));
OperationStatus status = mytestdb.put(null, keyEntry, valEntry);
System.out.println("Put Status: " + status);

//R
DatabaseEntry valGet = new DatabaseEntry();
status = mytestdb.get(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("Read Value:" + value);
}

//U
value = "This is a test!(111)";
status = mytestdb.put(null, keyEntry, new DatabaseEntry(value.getBytes("utf-8")));

status = mytestdb.get(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("Update Value:" + value);
}

//D
status = mytestdb.delete(null, keyEntry);
System.out.println("Delete Status: " + status);


(4)不同的数据写入方式
String key = "key-rensanning";
DatabaseEntry keyEntry = new DatabaseEntry(key.getBytes("utf-8"));
DatabaseEntry valGet = new DatabaseEntry();

String value = "This is a test!(by 'put' method)";
//Database.put(): 向数据库写入数据,如果不支持重复记录,则会覆盖更新key对应的已有记录
OperationStatus status = mytestdb.put(null, keyEntry, new DatabaseEntry(value.getBytes("utf-8")));

status = mytestdb.get(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("Put Value:" + value);
}

//Database.putNoOverwrite():向数据库写入数据,但是如果key已经存在,不会覆盖已有数据(即使数据库支持重复key)
value = "This is a test!(by 'putNoOverwrite' method)";
status = mytestdb.putNoOverwrite(null, keyEntry, new DatabaseEntry(value.getBytes("utf-8")));

status = mytestdb.get(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("PutNoOverwrite Value:" + value);
}

//*****设置一个key是否允许存储多个值*****
DatabaseConfig dbCfg = new DatabaseConfig();
dbCfg.setAllowCreate(true);
dbCfg.setReadOnly(false);
dbCfg.setTransactional(true);
dbCfg.setSortedDuplicates(true);

Database mytestdb2 = mytestdb.getEnvironment().openDatabase(null, "DuplicatesDB", dbCfg);

//Database.putNoDupData():向数据库写入数据(该方法仅用于支持重复key的数据库),如果key和value对应的记录已经存在,那么操作结果是:OperationStatus.KEYEXIST
value = "This is a test!(by 'putNoDupData' method)";
status = mytestdb2.putNoDupData(null, keyEntry, new DatabaseEntry(value.getBytes("utf-8")));
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("PutNoOverwrite Value:" + value);
} else if (status == OperationStatus.KEYEXIST) {
	System.out.println("putNoDupData KEYEXIST:" + key);
}

status = mytestdb2.get(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("putNoDupData Value:" + value);
}

if (null != mytestdb2) {
	mytestdb2.close();
	mytestdb2 = null;
}


(5)不同的数据读取方式
String key = "key-rensanning";
String value = "This is a test!(000)";
DatabaseEntry keyEntry = new DatabaseEntry(key.getBytes("utf-8"));
DatabaseEntry valEntry = new DatabaseEntry(value.getBytes("utf-8"));
OperationStatus status = mytestdb.put(null, keyEntry, valEntry);
System.out.println("Put Status: " + status);

DatabaseEntry valGet = new DatabaseEntry();

//Database.get() :检索key对应的记录
status = mytestdb.get(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("Read Value(get):" + value);
}

//Database.getSearchBoth() :根据key和value 检索数据库记录
status = mytestdb.getSearchBoth(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = new String(valGet.getData(), "utf-8");
	System.out.println("Read Value(getSearchBoth):" + value);
}


(6)对象的读写
//C
String key = "key-rensanning-Object";
Person value = new Person(9527, "rensanning", true);

DatabaseEntry keyEntry = new DatabaseEntry(key.getBytes("utf-8"));
DatabaseEntry valEntry = new DatabaseEntry();
PersonTupleBinding personBinding = new PersonTupleBinding();
personBinding.objectToEntry(value, valEntry);

OperationStatus status = mytestdb.put(null, keyEntry, valEntry);
System.out.println("Put Person Status: " + status);

//R
DatabaseEntry valGet = new DatabaseEntry();
status = mytestdb.get(null, keyEntry, valGet, LockMode.DEFAULT);
if (status == OperationStatus.SUCCESS) {
	value = personBinding.entryToObject(valGet);
	System.out.println("Read Person Value:" + value.getId() + "\t" + value.getName() + "\t" + value.isSex());
}

class Person {
	int id;
	String name;
	boolean sex;

	public Person() {
	}
	
	public Person(int id, String name, boolean sex) {
		this.id = id;
		this.name = name;
		this.sex = sex;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public boolean isSex() {
		return sex;
	}
	public void setSex(boolean sex) {
		this.sex = sex;
	}
}

class PersonTupleBinding extends TupleBinding<Person> {

	@Override
	public Person entryToObject(TupleInput input) {
		Person p = new Person();
		p.setId(input.readInt());
		p.setName(input.readString());
		p.setSex(input.readBoolean());
		return p;
	}

	@Override
	public void objectToEntry(Person p, TupleOutput output) {		
		output.writeInt(p.getId());
		output.writeString(p.getName());
		output.writeBoolean(p.isSex());
	}
}


(7)直接持久层应用(DPL:Direct Persistence Layer)
Environment env = mytestdb.getEnvironment();

StoreConfig storeConfig = new StoreConfig();
storeConfig.setAllowCreate(true);
storeConfig.setTransactional(true);

EntityStore store = new EntityStore(env, "StoreDB", storeConfig);

PrimaryIndex<String, UserInfo> pIndex = store.getPrimaryIndex(String.class, UserInfo.class);

//C
pIndex.put(new UserInfo("001", "user001"));
pIndex.put(new UserInfo("002", "user002"));
pIndex.put(new UserInfo("003", "user003"));
pIndex.put(new UserInfo("004", "user004"));
pIndex.put(new UserInfo("005", "user005"));

//R
String myKey = "001";
UserInfo getData = pIndex.get(myKey);
System.out.println("Read User 001:" + getData);

//U
pIndex.put(new UserInfo("002", "user002222"));

//Read ALL
EntityCursor<UserInfo> cursor = pIndex.entities();
try {
	Iterator<UserInfo> i = cursor.iterator();
	while (i.hasNext()) {
		System.out.println("Cursor data:" + i.next());
	}
} finally {
	cursor.close();
}

//D
String pkey = "003";
boolean flag = pIndex.delete(pkey);
System.out.println("delete object :" + pkey + " result:" + flag);

//关闭store
if (store != null) {
	store.close();
	store = null;
}

@Entity
@SuppressWarnings("serial")
class UserInfo implements Serializable {
	
	@PrimaryKey
	private String userId;
	private String userName;

	public UserInfo() {
	}

	public UserInfo(String userId, String userName) {
		this.userId = userId;
		this.userName = userName;
	}

	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}

	@Override
	public String toString() {
		return "UserInfo [userId=" + userId + ", userName=" + userName + "]";
	}
}


(8)事务处理
Transaction txn = mytestdb.getEnvironment().beginTransaction(null, null);
try {
	for(int i = 0; i < 5; i++) {
		mytestdb.put(txn, new DatabaseEntry(("TXN-KEY"+(i+1)).getBytes("utf-8")), new DatabaseEntry(("TXN-VALUE"+(i+1)).getBytes("utf-8")));
	}
} catch (DatabaseException e) {
	if (txn != null) {
		txn.abort();
		txn = null;
	}
	throw e;
} finally {
	if (txn != null) {
		txn.commit();
	}
}


(9)游标操作
//C
for(int i = 0; i < 5; i++) {
	mytestdb.put(null, new DatabaseEntry(("KEY"+(i+1)).getBytes("utf-8")), new DatabaseEntry(("VALUE"+(i+1)).getBytes("utf-8")));
}

DatabaseEntry key = new DatabaseEntry();
DatabaseEntry value = new DatabaseEntry();

//D (by Cursor)
Transaction txn = mytestdb.getEnvironment().beginTransaction(null, null);
Cursor cursor1 = mytestdb.openCursor(txn, null);
OperationStatus result1 = cursor1.getFirst(key, value, null);
while (result1 == OperationStatus.SUCCESS) {
	if ("VALUE3".equals(new String(value.getData(), "utf-8"))) {
		cursor1.delete();
	}		
	result1 = cursor1.getNext(key, value, null);
}

if (cursor1 != null) {
	cursor1.close();
}
if (txn != null) {
	txn.commit();
}

//R (by Cursor)
Cursor cursor2 = mytestdb.openCursor(null, null);
OperationStatus result2 = cursor2.getFirst(key, value, null);

while (result2 == OperationStatus.SUCCESS) {
	System.out.println("Cursor Read Value:" + new String(value.getData(), "utf-8"));			
	result2 = cursor2.getNext(key, value, null);
}

if (cursor2 != null) {
	cursor2.close();
}


(10)关闭database
//关闭database
if (mytestdb != null) {
	mytestdb.close();
	mytestdb = null;
}


(11)关闭database环境
//关闭database环境
if (mydbEnv != null) {
	mydbEnv.sync();//把数据同步到磁盘中去
	mydbEnv.cleanLog();//清理日志
	mydbEnv.close();
	mydbEnv = null;
}
分享到:
评论

相关推荐

    vedis-python, Vedis嵌入式 NoSQL 数据库的python 绑定.zip

    vedis-python, Vedis嵌入式 NoSQL 数据库的python 绑定 Vedis嵌入式 NoSQL 数据库的快速 python 绑定。...快速的嵌入式数据库,。查看 vedis python文档 。特性Vedis特性:嵌入式,零conf数据库事务性( ACID )单

    NoSQL数据库PPT.pptx

    NoSQL数据库 14信管一班2组23殷月园 NoSQL数据库PPT全文共20页,当前为第1页。 内容大纲 定义 产生 共同特征 分类 适用场景 发展现状 7 挑战 NoSQL数据库PPT全文共20页,当前为第2页。 一.什么是NoSQL数据库? NoSQL...

    JAVA操作NOSQL数据库

    在实际项目中,Java开发者不仅需要掌握基本的数据库操作,还需要理解NOSQL数据库的特性,如一致性模型、分区策略和数据模型,以便更好地利用这些数据库的优势。同时,熟悉相关的开源库和最佳实践,可以帮助提高代码...

    《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 HBase原理实现.pdf

    《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 HBase原理实现.pdf《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 HBase原理实现.pdf《NoSQL数据库原理与应用案例教程》PPT课件(共9单元)第4章 ...

    NoSQL数据库原理课件-侯宾.zip

    【分布式数据库原理与NoSQL详解】 在当今大数据时代,传统的SQL关系型数据库已经无法满足海量数据的存储和处理需求,因此分布式数据库和NoSQL数据库应运而生。本课件将深入探讨分布式数据库的原理以及NoSQL数据库的...

    NOsql数据库论文

    Nosql数据库的这种天然的优势使之在分布式数据库中占据着越来越重要的地位。 6. 分布式数据库系统的组成 分布式数据库系统由分布于多个计算机结点上的若干个数据库系统组成,提供有效的存取手段来操纵这些结点上...

    unqlite-python:UnQLite嵌入式NoSQL数据库的Python绑定

    快速Python绑定, 是一个轻量级的嵌入式NoSQL数据库和JSON文档存储。请注意在考虑使用它之前,请阅读的问题跟踪器。 自2014年以来,UnQLite尚未出现任何有意义的发展。强烈建议您使用 。 Sqlite具有对强大支持,并且...

    亚硝酸盐数据库:Java嵌入式nosql文档存储

    在嵌入式数据库方面,亚硝酸盐数据库不需要独立的服务进程,直接作为应用程序的一部分运行,这意味着它不依赖网络连接,可以提供更快的访问速度和更好的数据安全性。这对于移动应用而言尤为重要,因为它们往往需要...

    NoSQL数据库技术与应用.pptx

    NoSQL数据库技术与应用 NoSQL数据库技术是一种非关系型数据库,适用于大规模、高并发、高灵活性的数据存储和管理。它具有分布式、可扩展、灵活性和高并发等优势。NoSQL数据库技术可以分为四大类:键值存储、图形...

    NoSQL数据库之Redis数据库管理视频教程

    ### NoSQL数据库之Redis数据库管理视频教程 #### NoSQL数据库简介 NoSQL(Not Only SQL)数据库是指非关系型数据库,它们与传统的关系型数据库在数据存储方式上有显著区别。NoSQL数据库通常支持灵活的数据模式,...

    Berkeley DB Java Edition 5.0.73

    Berkeley DB Java Edition(简称BDB JE)是一款由Oracle公司开发的高性能、轻量级的NoSQL数据库系统。它以其高效能、可扩展性和可靠性在处理大规模数据存储时受到广泛欢迎,尤其是在Google这样的大型互联网公司中,...

    NoSQL数据库技NoSQL最新技术发展趋势.pdf

    NoSQL数据库技术发展趋势 NoSQL数据库技术发展趋势是当前数据库技术发展...NoSQL数据库技术发展趋势是当前数据库技术发展的主要趋势之一。阿里云NoSQL生态开放实践将推动数据库技术的发展,提高数据库的性能和灵活性。

    NoSQL数据库技术实战

    NoSQL数据库技术实战 数据库书籍!

    NoSQL数据库入门 高清PDF

    1. **高可扩展性**:NoSQL数据库设计之初就考虑到了水平扩展的问题,能够轻松地通过增加更多的服务器来提升性能和容量。 2. **高性能**:NoSQL数据库采用内存缓存技术和优化的索引机制,能够实现快速读写操作。 3. *...

    NOSQL数据库入门 . 佐佐木达也 .罗勇.扫描版.pdf

    相比之下,NoSQL数据库可能牺牲部分事务一致性以换取更高的性能和可扩展性。 - **查询语言**:SQL数据库使用SQL语言进行数据查询和操作,而NoSQL数据库通常提供特定于系统的查询接口或API。 ### 结论 NoSQL数据库...

    nosql数据库的发展和应用研究

    nosql数据库的发展和应用研究

    NoSQL数据库入门思维导图

    【标题】:“NoSQL数据库入门思维导图” 【描述】提到这是一个使用特定软件MindManager打开的资源,包含两张关于数据库的思维导图。这暗示了我们将会探讨的是NoSQL数据库的基础概念以及常见的NoSQL数据库类型。 ...

    大数据-大数据挑战与NoSQL数据库技术

    《大数据挑战与NoSQL数据库技术》共分为三部分。理论篇重点介绍大数据时代下数据处理的基本理论及相关处理技术,并引入NoSQL数据库;系统篇主要介绍了各种类型NoSQL数据库的基本知识;应用篇对国内外几家知名公司在...

Global site tag (gtag.js) - Google Analytics