最近发现berkeleydb还是不错的,存储相同的数据量,要比磁盘索引小得多,第一次用这样的非关系型数据库,写了个 基本操作的代码
package com.berkeleydb.java;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.bind.tuple.StringBinding;
import com.sleepycat.je.Cursor;
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;
import com.sleepycat.je.Transaction;
public class CRUD {
private File dbPath = new File("D:\\berkeleydb-java2");
@Before
public void init()throws IOException{
/*if(dbPath.exists()){
FileUtils.cleanDirectory(dbPath);
}else{*/
FileUtils.forceMkdir(dbPath);
//}
}
/**
* 向berkeleydb中添加多条信息
* @throws Exception
*/
@Test
public void addObject() throws Exception {
EnvironmentConfig envConfig = new EnvironmentConfig();
DatabaseConfig dbConfig = new DatabaseConfig();
envConfig.setTransactional(true);
envConfig.setAllowCreate(true);
envConfig.setLocking(true);
//日志的最大长度,日志和数据是一起的,这个参数决定当达到LOG_FILE_MAX后,再切分一个单独的文件
envConfig.setConfigParam(EnvironmentConfig.LOG_FILE_MAX, "104857600");
dbConfig.setAllowCreate(true);
dbConfig.setTransactional(true);
Environment env = new Environment(dbPath, envConfig);
Transaction txn = env.beginTransaction(null, null);
//第一个数据库
Database bindingsDb = env.openDatabase(txn, "bindingsDb", dbConfig);
//这个是用来存储 class信息的库
Database catalogDb = env.openDatabase(txn, "catalogDb", dbConfig);
//绑定可序列化的类
StoredClassCatalog classCatalog = new StoredClassCatalog(catalogDb);
EntryBinding<Document> dataBinding = new SerialBinding<Document>(classCatalog, Document.class);
txn.commit();
DatabaseEntry theKey = new DatabaseEntry();
DatabaseEntry theData = new DatabaseEntry();
for (int i = 0; i < 100; i++) {
Document doc = new Document();
doc.setName("muxiaolin" + i);
doc.setPubtime(System.currentTimeMillis());
doc.setPath("c:\\xiaolin");
StringBinding.stringToEntry(i + "", theKey);
dataBinding.objectToEntry(doc, theData);
//开启事物
txn = env.beginTransaction(null, null);
bindingsDb.put(txn, theKey, theData);
txn.commit();
}
catalogDb.close();
bindingsDb.close();
env.close();
}
@Test
public void delete() throws Exception {
EnvironmentConfig envConfig = new EnvironmentConfig();
DatabaseConfig dbConfig = new DatabaseConfig();
envConfig.setTransactional(true);
envConfig.setAllowCreate(true);
envConfig.setLocking(true);
envConfig.setConfigParam(EnvironmentConfig.LOG_FILE_MAX, "104857600");
dbConfig.setAllowCreate(true);
dbConfig.setTransactional(true);
Environment env = new Environment(dbPath, envConfig);
Transaction txn = env.beginTransaction(null, null);
Database dataBase = env.openDatabase(txn, "bindingsDb", dbConfig);
String aKey = "20";
DatabaseEntry theKey = new DatabaseEntry();
StringBinding.stringToEntry(aKey, theKey);
if (dataBase.delete(txn, theKey) == OperationStatus.SUCCESS) {
System.out.println("delete success!");
} else {
System.out.println("No record found for key '" + aKey + "'.");
}
txn.commit();
dataBase.close();
env.close();
}
@Test
public void getObject() throws Exception {
EnvironmentConfig envConfig = new EnvironmentConfig();
DatabaseConfig dbConfig = new DatabaseConfig();
envConfig.setReadOnly(true);
dbConfig.setReadOnly(true);
Environment env = new Environment(dbPath, envConfig);
Database bindingsDb = env.openDatabase(null, "bindingsDb", dbConfig);
DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
Database catalogDb = env.openDatabase(null, "catalogDb", dbConfig);
StoredClassCatalog classCatalog = new StoredClassCatalog(catalogDb);
EntryBinding<Document> dataBinding = new SerialBinding<Document>(classCatalog, Document.class);
String aKey = "20";
StringBinding.stringToEntry(aKey, foundKey);
if (bindingsDb.get(null, foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
Document doc = dataBinding.entryToObject(foundData);
System.out.println(doc.toString());
} else {
System.out.println("No record found for key '" + aKey + "'.");
}
bindingsDb.close();
catalogDb.close();
env.close();
}
/**
* 游标查询
* @throws Exception
*/
@Test
public void cursor() throws Exception {
EnvironmentConfig envConfig = new EnvironmentConfig();
DatabaseConfig dbConfig = new DatabaseConfig();
envConfig.setReadOnly(true);
dbConfig.setReadOnly(true);
Environment env = new Environment(dbPath, envConfig);
Database bindingsDb = env.openDatabase(null, "bindingsDb", dbConfig);
Cursor cursor = bindingsDb.openCursor(null, null);
DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
Database catalogDb = env.openDatabase(null, "catalogDb", dbConfig);
StoredClassCatalog classCatalog = new StoredClassCatalog(catalogDb);
EntryBinding<Document> dataBinding = new SerialBinding<Document>(classCatalog, Document.class);
while (cursor.getNext(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
System.out.println(StringBinding.entryToString(foundKey));
System.out.println(dataBinding.entryToObject(foundData).toString());
}
cursor.close();
bindingsDb.close();
catalogDb.close();
env.close();
}
}
分享到:
相关推荐
BerkeleyDB-Core-C-GSG.pdf bdb c开发手册 英文版
Oracle BerkeleyDB-JE je-6.0.11
Java-Edition-BerkeleyDB-3.1.0,国外的开源数据库,供大家参考
(二) Berkeley DB -- Access Method Configuration_iyangjian2005997_新浪博客.mht
Berkeley DB -- 入门知识和一个小例子_iyangjian2005997_新浪博客.mht
Life After BerkeleyDB- OpenLDAP's Memory-Mapped Database
关于berkeley db 4.6.2的介绍性文章,是了解berkeley db的技术文档。
BerkeleyDB和Sqlite是当前最流行的嵌入式开源数据库。
db-6.1.26.tar.gz berkeley db
嵌入式数据库,功能强大,可用于如QQ本地的聊天记录数据库等,使用方便,效率高
Berkeley DB4.8以上各版本,已经亲测过哪些版本可与redhat6.5兼容,见附件名称备注。
Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,而不是像关系数据库那样需要网络通讯、SQL解析等步骤,本文件是早期版本
官方版本,亲测可用
Berkeley DB 4.4.20 .tar.gz 来自https://www.oracle.com/database/technologies/related/berkeleydb-release-history.html
来自于oracle的BerkeleyDB帮助文件,里面有代码的。
1. Introduction to Berkeley DB ......... 1 About This Manual .......... 2 Berkeley DB Concepts ........... 2 Access Methods ......... 4 Selecting Access Methods ......... 4 Choosing between BTree and ...
BerkeleyDB db-4.8.30.NC.tar.gz 免积分下载
文件类型的DB,存取速度快,操作方便,是以map方式key-value方式存取数据.兄弟大家共享!
BerkeleyDB:BerkeleyDB-对Berkeley DB 2.x或更高版本的Perl5访问
building-ha-scalable-applications-with-berkeley-db-whitepaper