文章目录

  • 简介
  • 获取JE安装环境
  • 代码

简介

Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的文件数据库。JE具有如下优点:

  1. 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。
  2. 多线程支持,JE使用超时的方式来处理线程间的死琐问题。
  3. Database都采用简单的key/value对应的形式。
  4. 支持事物。
  5. 允许创建二级库。这样我们就可以方便的使用一级key,二级key来访问我们的数据。
  6. 支持RAM缓冲,这样就能减少频繁的IO操作。
  7. 支持日志。
  8. 数据备份和恢复。
  9. 游标支持。、

获取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入门相关推荐

  1. BDB 入门篇 第1章 Berkeley DB Java Edition简介

    1. Berkeley DB Java Edition 简介 Berkeley DB Java Edition官网 Berkeley DB Java Edition官网文档 JE是一个100%用Jav ...

  2. Berkeley DB JE 学习笔记

    本篇是在学习BDB JE的使用.阅读源码并参读文档后的笔记,涉及到内部实现细节,写的比较零散,也有很多疏漏,仅作为笔记待查. Berkeley DB JE简介及主要特点 Java版Berkeley D ...

  3. Java那些事之Berkeley DB

    最近一直在使用java,随着使用时间的加长,对java也有了更深入的了解.从今天开始,我会写一些关于java的专题内容,希望大家喜欢,也希望各位多多讨论指正. 这一次先介绍一下Berkeley DB的 ...

  4. Berkeley DB基础教程

    一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...

  5. berkeley db java edition 源码,Berkeley DB Java Edition

    本来想写一篇,发现网上有一篇已经写的很好了,所以稍微加一些介绍,其他部分尤其是去看它的吧.附带自己写的一个connection 代码. 简介 Berkeley DB(BDB)是一个高性能的,嵌入式键值 ...

  6. Berkeley DB Java Edition

    一. 简介Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据.l 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不 ...

  7. 新浪研发中心: Berkeley DB 使用经验总结

    http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...

  8. 嵌入式数据库BERKELEY DB 之dubbo实战

    berkeley db 时oracle旗下的一款嵌入式数据库...当然,在互联网业界,他并不火,但是它确实很省内存,,对于一些想要替换redis的解决方案--可以考虑..想要学习它.甚至在一些主流的网 ...

  9. Berkeley DB学习(一)

    一.简介 定义:Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,而不是像关系数据库那样需要网络通讯.SQL ...

最新文章

  1. oracle找到引起账户锁定的ip,Oracle 找到引起账户锁定的IP
  2. 【maven】 pom.xml内容没有错,但一直报错红叉 解决办法
  3. HTML 怎么修改,怎么修改HTML
  4. C/C++中ASCII与Unicode字符串相互转换
  5. c/c++笔试面试题(4)
  6. CString类(转)
  7. 昆仑通态如何连接sqlserver数据库_sqlserver数据库怎么开启远程连接,给到别人访问...
  8. java反射优化_JAVA反射优化
  9. 天正编辑文字出现形未定义_天正双击不能编辑文字
  10. 如何把一张照片的像素提高_不改变像素尺寸怎么增加图片的文件大小
  11. Jenkins配置从节点问题:ssh slave known_hosts [SSH]与Slave JVM has terminated. Exit code=126
  12. 每天做好一件事,坦然微笑地面对生活
  13. STM32借助Mbed OS多线程调节电脑音量
  14. 笔记本计算机摄像头怎么打开方式,笔记本的摄像头怎么打开,手把手教你笔记本电脑摄像头如何打开...
  15. 如何降低less的版本
  16. RT-thread 环境下使用 HASH hwcrypto 配置使用底层硬件HAH库问题记录
  17. 计算机优先启动项,大白菜u盘装系统bios设置优先启动项操作方法
  18. 服务端渲染和客户端渲染
  19. 苹果ios按键精灵deb包旧版本1.3.8安装方法 --- checkra1n越狱版
  20. 图书管理系统-成绩管理系统

热门文章

  1. vue实现多图循环轮播
  2. 生动理解关联规则——Apriori算法
  3. 包含各种版本谷歌相机的网址及下载地址
  4. 家用简单电线路图_家庭电路安装走线图解析,教你4步快速布线
  5. 网易邮箱大师桌面版显示“服务器连接失败,请稍后重试”的一个解决办法
  6. 【微信小程序付款转二维码付款】
  7. MGCP /H.248 鉴权认证
  8. VC++自动生成的对话框类头文件中的enum {IDD= xxxx}解释
  9. hadoop权威指南第三版 发布说明
  10. 计算机-IEEE ACCESS-论文投稿上岸经验分享