1. 什么是BDB?

  • BDB 的全称是Berkeley Database,是一种开源的嵌入式文本数据库。
  • 它介于关系数据库与内存数据库之间,使用方式与内存数据库类似,因为它也是基于Key-Value形式存储,但它与内存数据库相比要更加强大。

强大在于有以下这些特性:

  • 一个高性能的Key-Value数据库,支持上百万的数据记录
  • 制约限制是硬件而不是它本身
  • 完整的ACID事务支持
  • 游标和二级索引支持
  • 交互式平台支持
  • 跨平台支持
  • 多线程支持
  • 支持日志
  • 数据备份与恢复
  • 支持RAM缓冲以减少频繁IO操作

当然它的强大不止于此,它甚至可以将对象直接存储到文件,并且建立一个一级索引和多个二级索引,根据我的理解,它在某种意义上应该也可以说是基于对象存储的一个数据库系统,因为它可以通过DPL直接将一个对象持久化到BDB数据库中。

2. BDB的历史发展

简单了解什么是BDB后,我们再来了解下它的发展历程。

BDB最早是由SyePyCAT软件从1996到2006的商业支持和开发。

这家公司于2006年2月被甲骨文公司收购,该公司继续开发和出售Berkeley DB。

Oracle的管理下,“Berkeley DB” 已成为三种不同的产品一个共同的品牌名称:

  • Oracle Berkeley DB
  • Berkeley DB java Edition
  • Berkeley DB XML

这三种产品都有共同的祖先,目前正在积极发展。

当然,接下来我将重点讲述Berkeley DB Java Edition,因为正如前面我说的那样,
它可以将对象直接存储到文件,并且建立一个一级索引和多个二级索引,这种基于对象存储的数据库系统,性能将会是十分强大的。

3. 学习资源

3.1 使用下载

3.1.1 Maven 下载

如果想在maven项目中使用,只需要在pom.xml中添加如下依赖即可:

<!-- https://mvnrepository.com/artifact/berkeleydb/je -->
<dependency><groupId>berkeleydb</groupId><artifactId>je</artifactId><version>3.2.76</version>
</dependency>

请移步Maven仓库镜像查看

3.1.2 Oracle 官网快速下载

Berkeley DB Java Edition (JE)

3.2 参考文档

3.2.1 官方参考文档

3.2.2 Berkeley DB Java Edition 中文翻译文档

Getting Started Guide 系列中文翻译列表:
BDB 入门篇 第1章 Berkeley DB Java Edition简介
BDB 入门篇 第2章 Database Environments
BDB 入门篇 第3章 Direct Persistence Layer First Steps
BDB 入门篇 第4章Working with Indices使用索引
BDB 入门篇 第5章 Saving and Retrieving Objects 保存和检索对象
BDB 入门篇 第6章 A DPL Example一个DPL 例子
附录:源码下载
Writing Transactional Applications 文档中文翻译列表
BDB 事务篇 第1章. Berkeley DB, Java Edition事务处理介绍
BDB 事务篇 第2章 Enabling Transactions 启用事务处理
BDB 事务篇 第3 章 Transaction Basics 事务处理基础
BDB 事务篇 第4章 Concurrency 并发
BDB 事务篇 第5章 备份和还原 Berkeley DB, Java Edition应用程序
BDB 事务篇 第6章 Summary and Examples 摘要和例子

3.2.3 其他博文

Berkeley DB Java Edition 原始API使用说明
BerkeleyDB Java Edition 注解API使用说明
BerkeleyDB Java Edition注解API使用源码
Java那些事之Berkeley DB
YoutuBe视频教程

3.2.4 原创博文

1. Think in Berkeley Database Java Edition 概述
2. Think in Berkeley Database Java Edition 实战JE 保存和读取一个对象
3. Think in Berkeley Database Java Edition实战JE数据访问器保存和读取多个对象
4.Think in Berkeley Database Java Edition 之增删改查实战

4. 日志详解

我们再来了解下它的数据库存储文件结构和重要的日志介绍

  • JE的日志文件跟其他的数据库的日志文件不太一样,跟C版的DBD也是有区别的
  • JE的日志文件只能APPEND,第一个日志文件名是 00000000.jdb,当他增长到一定大小的时候(默认是10M),开始写第二个日志文件00000001.jdb,已此类推。
  • 跟C版本有所不同,JE的数据日志和事务日志是放在一起的,而不是分开放的。
  • JE cleaner负责清扫没用到的磁盘空间,删除后,或者更新后新的记录会追加进来,而原有的记录空间就不在使用了,cleaner负责清理不用的空间。
  • 清理并不是立即进行的,当你关闭你的数据库环境后,通过调用一个cleaner方法来清理。
  • 清理也不是只动执行的,需要你自己手动调用cleaner 方法来定时清理的。
  • 日志文件的删除仅发生在检查点之后。cleaner准备出哪些log 文件需要被删除,当检查点过后,删掉一些不在被使用的文件。每写20M的日志文件就执行一次检查点,默认下。

注: *.jdb 是日志文件

关于数据库文件和日志文件

众所周知,传统的数据库文件和日志文件是分开存储的,但是在JE中数据库和日志并文件没有分开存储
相反,JE使用基于日志的存储系统来保护数据库的修改。 在对数据库进行任何更改之前,JE会将有关更改的信息写入日志文件。

5.常见异常

我们再来看下常见的异常,方便我们定位我们的程序Bug的解决。

  • DatabaseNotFoundException 当没有找到指定的数据库的时候会返回这个异常
  • DeadlockException 线程间死锁异常
  • RunRecoveryException 回收异常,当发生此异常的时候,你必须得重新打开环境变量。
  • The environment cannot be locked for single writer access.
    ENV_LOCKED: The je.lck file could not be locked. Environment is
    invalid and must be closed.
    两个进程(Process)对同一个BDB数据库环境文件进行读写操作时会有此异常。

Tips: 更多异常请参考译文中的内容或者等待我的博文更新。

6.代码实战

在java里头主要有两种使用方式,一种是基于注解DPL形式的,一种是基础的api使用。
DPL:Direct Persistence Layer 的简写,表示直接将对象持久化到数据库

6.1 Hello World 程序

接下来让我们写段代码来简单体验下它的基础用法。

import java.io.File;
import java.io.UnsupportedEncodingException;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.EnvironmentMutableConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;public class StudyEnvironmentConfigTest {// 配置数据库环境文件路径,private final static String BDB_ORGINAL_ENV_HOME_FILE_PATH = "original_env_home";private final static File BDB_ORGINAL_ENV_HOME_FILE = new File(BDB_ORGINAL_ENV_HOME_FILE_PATH);// 配置数据库文件名称private final static String BDB_FILE_NAME = "admin.db";public static void main(String[] args) {// TODO Auto-generated method stub// -----------------------数据库环境----------------------------// 创建数据库环境引用Environment myEnvironment = null;// -----------------------数据库环境配置----------------------------// 创建数据库环境配置对象EnvironmentConfig myEnvironmentConfig = new EnvironmentConfig();// 以只读方式打开,默认为falsemyEnvironmentConfig.setReadOnly(false);// 设置该环境支持事务myEnvironmentConfig.setTransactional(true);// 当环境不存在的时候自动创建环境,默认为falsemyEnvironmentConfig.setAllowCreate(true);// 环境路径不存在则创建if (!BDB_ORGINAL_ENV_HOME_FILE.exists()) {BDB_ORGINAL_ENV_HOME_FILE.mkdirs();}// 创建数据库环境对象并加载数据库环境配置myEnvironment = new Environment(BDB_ORGINAL_ENV_HOME_FILE, myEnvironmentConfig);// 创建数据库环境多配置对象EnvironmentMutableConfig myEnvironmentMutableConfig = new EnvironmentMutableConfig();// 当提交事务的时候是否把缓存中的内容同步到磁盘中去。true 表示不同步,也就是说不写磁盘myEnvironmentMutableConfig.setTxnNoSyncVoid(false);// 当提交事务的时候,是否把缓冲的log写到磁盘上 true 表示不同步,也就是说不写磁盘myEnvironmentMutableConfig.setTxnWriteNoSyncVoid(false);// 设置当前环境能够使用的RAM占整个JVM内存的百分比myEnvironmentMutableConfig.setCachePercent(90);// 设置当前环境能够使用的最大RAM。单位BYTEmyEnvironmentMutableConfig.setCacheSize(98304);myEnvironment.setMutableConfig(myEnvironmentMutableConfig);// 创建数据库配置对象DatabaseConfig myDatabaseConfig = new DatabaseConfig();// 设置该数据库支持事务myDatabaseConfig.setTransactional(true);// 如果数据库不存在就创建,默认为falsemyDatabaseConfig.setAllowCreate(true);// 以独占的方式打开,也就是说同一个时间只能有一实例打开这个database。myDatabaseConfig.setExclusiveCreate(false);// 只读方式打开,默认为falsemyDatabaseConfig.setReadOnly(false);// 创建数据库文件并加载数据库配置Database myDatabase = myEnvironment.openDatabase(null, BDB_FILE_NAME, myDatabaseConfig);System.out.println("-------------数据库环境配置信息Start---------------------------------");System.err.println("数据库环境配置信息:" + myEnvironment.getConfig());System.err.println("返回当前环境下的数据库列表:" + myEnvironment.getDatabaseNames());System.out.println("-------------数据库环境配置信息end---------------------------------");// 将aKey 和aData 放入数据库try {String aKey = "myFirstKey";String aData = "myFirstData";DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));myDatabase.put(null, theKey, theData);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 根据aKey 查找aDataString aKey = "myFirstKey";try {DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));DatabaseEntry theData = new DatabaseEntry();if (myDatabase.get(null, theKey, theData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {byte[] retData = theData.getData();String foundData = new String(retData, "UTF-8");System.out.println("For key: '" + aKey + "' found data: '" + foundData + "'.");} else {System.out.println("No record found for key '" + aKey + "'.");}} catch (Exception e) {// Exception handling goes heree.printStackTrace();System.out.println("未知异常");}System.out.println("-------------数据库的配置信息Start---------------------------------");System.err.println(myDatabase.getConfig());System.out.println("取得数据库的名称:" + myDatabase.getDatabaseName());System.out.println("取得包含这个database的环境信息:" + myDatabase.getEnvironment());System.out.println("-------------数据库的配置信息end---------------------------------");// 如果数据库不为空if (myDatabase != null) {// 关闭数据库myDatabase.close();}// 关闭数据库环境if (myEnvironment != null) {// 在关闭环境前清理下日志myEnvironment.cleanLog();// 关闭数据库 环境myEnvironment.close();}}
}

Berkeley Database Java Edition GitHub 源码
本篇完~

1. Think in Berkeley Database Java Edition 概述相关推荐

  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 java edition 源码,Berkeley DB Java Edition

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

  3. Berkeley DB Java Edition

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

  4. Berkeley DB Java Edition Installation Notes(BDB JE安装教程)

    1.下载 官方下载链接:http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/in ...

  5. linux java db2,[转载]DB2 UDB for Linux, UNIX 和 Windows 中的 Java 开发概述: V8.1 更新版

    DB2 UDB for Linux, UNIX 和 Windows 中的 Java 开发概述:V8.1 更新版 DB2 UDB V8 中为了支持 Java 已经做了很多更改.本文总结了所有这些更改,同 ...

  6. Java基础-Java概述-Java语言概述

    Java工程师知识树 / Java基础 文章目录 Java语言概述 概述: 发展历程 1.发展概述 2.JDK 版本更新历史及技术点 编程开发 编程环境 编程工具 语言特点 1.简单性 2.面向对象 ...

  7. Java语言概述与简单程序

    Java语言概述 1. Java语言平台 1,J2EE(Java 2 Platform Enterprise Edition) 企业版 : 开发企业环境下的应用程序,主要针对web程序开发 2,J2S ...

  8. 第一章:Java语言概述

    Java语言的诞生.特点 java之父Jgosling团队在开发"Green"项目时,发现C缺少垃圾回收系统,还有可移植的安全性.分布程序设计.和多线程功能.最后,他们想要一种易于 ...

  9. java语言概述、java语言特性、java语言发展史、java语言作用

    Java介绍: Java语言概述: Java语言是由美国Sun(Stanford University Network)斯坦福网络公司的java语言之父–詹姆斯·高斯林,在1995年推出的高级的编程语 ...

最新文章

  1. 直流电动机matlab仿真实验,直流电动机的MATLAB仿真.doc
  2. Java番外篇2——jdk8新特性
  3. 计算机怎么把硬盘分成几个,如何把电脑的一个盘的容量分给另外一个盘
  4. 用cmd命令简单创建oracle 数据库、用户和表空间
  5. centos7 源码安装redis
  6. Git基础之(十五)——分支管理——分支管理策略
  7. 关闭笔记本电脑计算机键盘,笔记本小键盘怎么关闭,教您怎么关闭笔记本小键盘...
  8. 遗传算法bp神经网络原理,bp神经网络 遗传算法
  9. 中国区边界shp文件以及STRM 90m DEM分享(百度云免费下载链接)
  10. 数学中倒三角:梯度;正三角:拉普拉斯
  11. Ps做的图片html显示不了,为什么导入到PS的图片有图层却显示不出来?
  12. 【数据库】编写存储过程
  13. U盘在远程电脑安装软件
  14. 【转】现代c++开发利器folly教程系列之:future/promise
  15. 冯诺依曼结构 与 哈佛结构
  16. eMMC(二)——分区管理
  17. 串口的认识(COM接口)
  18. python爬虫实战之逆向分析酷狗音乐
  19. 高斯混合模型下的变分推断
  20. 2019.2.22 前端的精髓 动态js生成页面

热门文章

  1. chrome查看http请求是否压缩,以及压缩比例
  2. 海云安带你解读移动金融APP安全报告
  3. 五年级英语测试题软件,最新小学五年级英语检测题
  4. Crackme006 - 全新160个CrackMe深度解析系列(图文+视频+注册机源码)
  5. html作业 百度网盘,百度学院任务一:零基础HTML编码 作业.html
  6. @keyframes书写顺序
  7. 模仿QQ音乐做的一个前端界面+矢量图标库推荐
  8. Qt嵌入浏览器开发——下载编译
  9. 《Mastering the game of Go with deep neural networks and tree search》
  10. Layabox引擎用HTML5还原3D端游