Berkeley DB之JE入门
文章目录
- 简介
- 获取JE安装环境
- 代码
简介
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的文件数据库。JE具有如下优点:
- 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。
- 多线程支持,JE使用超时的方式来处理线程间的死琐问题。
- Database都采用简单的key/value对应的形式。
- 支持事物。
- 允许创建二级库。这样我们就可以方便的使用一级key,二级key来访问我们的数据。
- 支持RAM缓冲,这样就能减少频繁的IO操作。
- 支持日志。
- 数据备份和恢复。
- 游标支持。、
获取JE安装环境
JE下载地址:http://download.oracle.com/otn/berkeley-db/je-7.5.11.zip
解压包后,把JE_HOME/lib/je-.jar中的jar文件添加到你的环境变量中就可以使用je了。
相关帮助文档可以参考 JE_HOME/docs/index.html
相关源代码见JE_HOME/src/.
代码
JE操作类
package je_test;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;import com.sleepycat.je.Cursor;
import com.sleepycat.je.CursorConfig;
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.LockConflictException;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.Transaction;
import com.sleepycat.je.TransactionConfig;public class BerkeleyDBUtil {// 数据库环境private Environment env = null;// 数据库private static Database frontierDatabase = null;// 数据库名private static String dbName = "frontier_database";public BerkeleyDBUtil(String homeDirectory) {// 1、创建EnvironmentConfigEnvironmentConfig envConfig = new EnvironmentConfig();envConfig.setTransactional(true);envConfig.setAllowCreate(true);// 2、使用EnvironmentConfig配置Environmentenv = new Environment(new File(homeDirectory), envConfig);// 3、创建DatabaseConfigDatabaseConfig dbConfig = new DatabaseConfig();dbConfig.setTransactional(true);
dbConfig.setAllowCreate(true);// 4、使用Environment与DatabaseConfig打开DatabasefrontierDatabase = env.openDatabase(null, dbName, dbConfig);}/** 向数据库中写入记录,并判断是否可以有重复数据。 传入key和value* 若可以有重复数据,则直接使用put()即可,若不能有重复数据,则使用putNoOverwrite()。*/public boolean writeToDatabase(String key, String value, boolean isOverwrite) {try {// 设置key/value,注意DatabaseEntry内使用的是bytes数组DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8"));DatabaseEntry theData = new DatabaseEntry(value.getBytes("UTF-8"));OperationStatus status = null;Transaction txn = null;try {// 1、Transaction配置TransactionConfig txConfig = new TransactionConfig();txConfig.setSerializableIsolation(true);txn = env.beginTransaction(null, txConfig);// 2、写入数据if (isOverwrite) {status = frontierDatabase.put(txn, theKey, theData);} else {status = frontierDatabase.putNoOverwrite(txn, theKey, theData);}txn.commit();if (status == OperationStatus.SUCCESS) {System.out.println("向数据库" + dbName + "中写入:" + key + "," + value);return true;} else if (status == OperationStatus.KEYEXIST) {System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "失败,该值已经存在");return false;} else {System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "失败");return false;}} catch (LockConflictException lockConflict) {txn.abort();System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "出现lock异常");return false;}} catch (Exception e) {// 错误处理System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "出现错误");return false;}}/** 从数据库中读出数据 传入key 返回value*/public String readFromDatabase(String key) {try {DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8"));DatabaseEntry theData = new DatabaseEntry();Transaction txn = null;try {// 1、配置 Transaction相关信息TransactionConfig txConfig = new TransactionConfig();txConfig.setSerializableIsolation(true);txn = env.beginTransaction(null, txConfig);// 2、读取数据OperationStatus status = frontierDatabase.get(txn, theKey, theData, LockMode.DEFAULT);txn.commit();if (status == OperationStatus.SUCCESS) {// 3、将字节转换成Stringbyte[] retData = theData.getData();String value = new String(retData, "UTF-8");System.out.println("从数据库" + dbName + "中读取:" + key + "," + value);return value;} else {System.out.println("No record found for key '" + key + "'.");return "";}} catch (LockConflictException lockConflict) {txn.abort();System.out.println("从数据库" + dbName + "中读取:" + key + "出现lock异常");return "";}} catch (UnsupportedEncodingException e) {e.printStackTrace();return "";}}/** 遍历数据库中的所有记录,返回list*/public ArrayList<String> getEveryItem() {// TODO Auto-generated method stubSystem.out.println("===========遍历数据库" + dbName + "中的所有数据==========");Cursor myCursor = null;ArrayList<String> resultList = new ArrayList<String>();Transaction txn = null;try {txn = this.env.beginTransaction(null, null);CursorConfig cc = new CursorConfig();cc.setReadCommitted(true);if (myCursor == null)myCursor = frontierDatabase.openCursor(txn, cc);DatabaseEntry foundKey = new DatabaseEntry();DatabaseEntry foundData = new DatabaseEntry();// 使用cursor.getPrev方法来遍历游标获取数据if (myCursor.getFirst(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {String theKey = new String(foundKey.getData(), "UTF-8");String theData = new String(foundData.getData(), "UTF-8");resultList.add(theKey);System.out.println("Key | Data : " + theKey + " | " + theData + "");while (myCursor.getNext(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {theKey = new String(foundKey.getData(), "UTF-8");theData = new String(foundData.getData(), "UTF-8");resultList.add(theKey);System.out.println("Key | Data : " + theKey + " | " + theData + "");}}myCursor.close();txn.commit();return resultList;} catch (UnsupportedEncodingException e) {e.printStackTrace();return null;} catch (Exception e) {System.out.println("getEveryItem处理出现异常");txn.abort();if (myCursor != null) {myCursor.close();}return null;}}/** 根据key值删除数据库中的一条记录*/public boolean deleteFromDatabase(String key) {boolean success = false;long sleepMillis = 0;for (int i = 0; i < 3; i++) {if (sleepMillis != 0) {try {Thread.sleep(sleepMillis);} catch (InterruptedException e) {e.printStackTrace();}sleepMillis = 0;}Transaction txn = null;try {// 1、使用cursor.getPrev方法来遍历游标获取数据TransactionConfig txConfig = new TransactionConfig();txConfig.setSerializableIsolation(true);txn = env.beginTransaction(null, txConfig);DatabaseEntry theKey;theKey = new DatabaseEntry(key.getBytes("UTF-8"));// 2、删除数据 并提交OperationStatus res = frontierDatabase.delete(txn, theKey);txn.commit();if (res == OperationStatus.SUCCESS) {System.out.println("从数据库" + dbName + "中删除:" + key);success = true;return success;} else if (res == OperationStatus.KEYEMPTY) {System.out.println("没有从数据库" + dbName + "中找到:" + key + "。无法删除");} else {System.out.println("删除操作失败,由于" + res.toString());}return false;} catch (UnsupportedEncodingException e) {e.printStackTrace();return false;} catch (LockConflictException lockConflict) {System.out.println("删除操作失败,出现lockConflict异常");sleepMillis = 1000;continue;} finally {if (!success) {if (txn != null) {txn.abort();}}}return false;}public void closeDB() {if (frontierDatabase != null) {frontierDatabase.close();}if (env != null) {env.close();}}
}
JE测试类
package je_test;public class BerkeleyDBUtilTest { private BerkeleyDBUtil dbUtil = new BerkeleyDBUtil("/Users/liuzhixiong/Desktop/envhome/"); public static void main(String[] args) {new BerkeleyDBUtilTest().testWriteToDatabase();String key = "2";String value = new BerkeleyDBUtilTest().testReadFromDatabase(key);System.out.println("value=" + value);}public void testWriteToDatabase() { for (int i = 0; i < 10; i++){ dbUtil.writeToDatabase(i+"", "学生"+i, true); } } public String testReadFromDatabase(String key) { String value = dbUtil.readFromDatabase(key);return value;} public int testGetEveryItem() { int size = dbUtil.getEveryItem().size(); return size;} public void testDeleteFromDatabase() { dbUtil.deleteFromDatabase("4"); } public void cleanup() { dbUtil.closeDB(); }
}
Berkeley DB之JE入门相关推荐
- BDB 入门篇 第1章 Berkeley DB Java Edition简介
1. Berkeley DB Java Edition 简介 Berkeley DB Java Edition官网 Berkeley DB Java Edition官网文档 JE是一个100%用Jav ...
- Berkeley DB JE 学习笔记
本篇是在学习BDB JE的使用.阅读源码并参读文档后的笔记,涉及到内部实现细节,写的比较零散,也有很多疏漏,仅作为笔记待查. Berkeley DB JE简介及主要特点 Java版Berkeley D ...
- Java那些事之Berkeley DB
最近一直在使用java,随着使用时间的加长,对java也有了更深入的了解.从今天开始,我会写一些关于java的专题内容,希望大家喜欢,也希望各位多多讨论指正. 这一次先介绍一下Berkeley DB的 ...
- Berkeley DB基础教程
一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...
- berkeley db java edition 源码,Berkeley DB Java Edition
本来想写一篇,发现网上有一篇已经写的很好了,所以稍微加一些介绍,其他部分尤其是去看它的吧.附带自己写的一个connection 代码. 简介 Berkeley DB(BDB)是一个高性能的,嵌入式键值 ...
- Berkeley DB Java Edition
一. 简介Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据.l 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不 ...
- 新浪研发中心: Berkeley DB 使用经验总结
http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...
- 嵌入式数据库BERKELEY DB 之dubbo实战
berkeley db 时oracle旗下的一款嵌入式数据库...当然,在互联网业界,他并不火,但是它确实很省内存,,对于一些想要替换redis的解决方案--可以考虑..想要学习它.甚至在一些主流的网 ...
- Berkeley DB学习(一)
一.简介 定义:Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,而不是像关系数据库那样需要网络通讯.SQL ...
最新文章
- oracle找到引起账户锁定的ip,Oracle 找到引起账户锁定的IP
- 【maven】 pom.xml内容没有错,但一直报错红叉 解决办法
- HTML 怎么修改,怎么修改HTML
- C/C++中ASCII与Unicode字符串相互转换
- c/c++笔试面试题(4)
- CString类(转)
- 昆仑通态如何连接sqlserver数据库_sqlserver数据库怎么开启远程连接,给到别人访问...
- java反射优化_JAVA反射优化
- 天正编辑文字出现形未定义_天正双击不能编辑文字
- 如何把一张照片的像素提高_不改变像素尺寸怎么增加图片的文件大小
- Jenkins配置从节点问题:ssh slave known_hosts [SSH]与Slave JVM has terminated. Exit code=126
- 每天做好一件事,坦然微笑地面对生活
- STM32借助Mbed OS多线程调节电脑音量
- 笔记本计算机摄像头怎么打开方式,笔记本的摄像头怎么打开,手把手教你笔记本电脑摄像头如何打开...
- 如何降低less的版本
- RT-thread 环境下使用 HASH hwcrypto 配置使用底层硬件HAH库问题记录
- 计算机优先启动项,大白菜u盘装系统bios设置优先启动项操作方法
- 服务端渲染和客户端渲染
- 苹果ios按键精灵deb包旧版本1.3.8安装方法 --- checkra1n越狱版
- 图书管理系统-成绩管理系统