Bdb je的底层存储格式是Log-Structured File System,即就像写日志那样append only,并且其日志和数据是存在一起不分开的。
因此bdb的存储格式是面向entry的,一个entry或代表一个record,或代表一条日志等等。
从源码分析,bdb的entry总共有几十种之多,根据不同的配置使用不同的entry。代码结构是这样的:
je是以一个目录为一个Environment,而一个目录里面可以有多个Database,每个Database可以存储若干key-value,实际上有点像库和表的概念 对于一个Environmrnt来说,其B+tree格式如下:
通过Mapping IN和BIN将不同的Database映射分开。
逻辑上的B+tree node是这样的:
有些db支持duplicate record,因此,对于这种情况下,btree格式如下:
多种entry对应一个Java类,下面依次介绍:
Entry Types
|
Class
|
Feature
|
LOG_LN_TRANSACTIONAL
|
LNLogEntry
|
Leaf Nodes In Transactional
|
LOG_LN
|
LNLogEntry
|
Leaf Nodes without Transactional
|
LOG_MAPLN_TRANSACTIONAL
|
LNLogEntry
|
MapLN Nodes In Transactional
|
LOG_MAPLN
|
LNLogEntry
|
MapLN Nodes Without Transactional
|
LOG_NAMELN_TRANSACTIONAL
|
NameLNLogEntry
|
Log NameLN when rename or delete database
|
LOG_NAMELN
|
NameLNLogEntry
|
..
|
LOG_DEL_DUPLN_TRANSACTIONAL
|
DeletedDupLNLogEntry
|
Deleted Dup LNs
|
LOG_DEL_DUPLN
|
DeletedDupLNLogEntry
|
…
|
LOG_DUPCOUNTLN_TRANSACTIONAL
|
LNLogEntry
|
Count of a Dup tree
|
LOG_DUPCOUNTLN
|
LNLogEntry
|
…
|
LOG_FILESUMMARYLN
|
LNLogEntry
|
File summary like records count
|
LOG_IN
|
INLogEntry
|
Internal Nodes
|
LOG_BIN
|
INLogEntry
|
Bottom Internal Nodes
|
LOG_DIN
|
INLogEntry
|
Duplicate Internal Nodes
|
LOG_DBIN
|
INLogEntry
|
…
|
LOG_ROOT
|
SingleItemEntry
|
Represent a DbTree
|
LOG_TXN_COMMIT
|
SingleItemEntry
|
Transaction Commit
|
LOG_TXN_ABORT
|
SingleItemEntry
|
Transaction Abort
|
LOG_CKPT_START
|
SingleItemEntry
|
Check point start
|
LOG_CKPT_END
|
SingleItemEntry
|
|
LOG_IN_DELETE_INFO
|
SingleItemEntry
|
Remove a child from a IN
|
LOG_BIN_DELTA
|
BINDeltaLogEntry
|
Delta log of BIN
|
LOG_DUP_BIN_DELTA
|
BINDeltaLogEntry
|
|
LOG_TRACE
|
SingleItemEntry
|
Log a messages like:
“Close of environment bk1 started”
|
LOG_FILE_HEADER
|
FileHeaderEntry
|
The most import data
|
LOG_IN_DUPDELETE_INFO
|
SingleItemEntry
|
|
LOG_TXN_PREPARE
|
SingleItemEntry
|
Transaction Prepare
|
LOG_ROLLBACK_START
|
SingleItemEntry
|
Rollback Start
|
LOG_ROLLBACK_END
|
SingleItemEntry
|
Rollback End
|
LOG_MATCHPOINT
|
SingleItemEntry
|
For Replication Syncup
|
LogManager不关心具体的entry,而是将相应的entry的内容写入磁盘,而具体是什么类型的entry将通过每个entry的头两个字节体现:
Log type(8 bits)
Provisional(2 bits) Replicated(1 bit) Invisible(1 bit) Version(5 bits)
第一个字节代表entry的类型,而第二个字节代表相关环境信息。
这里分析其中一个很重要的entry:LNLogEntry,请看代码:
/*
* Persistent fields in an LN entry.
*/
private LN ln;
private DatabaseId dbId;
private byte[] key;
private long abortLsn = DbLsn.NULL_LSN;
private boolean abortKnownDeleted;
private Txn txn; // conditional
其中的LN又包括以下信息:
private static final String BEGIN_TAG = "<ln>";
private static final String END_TAG = "</ln>";
private byte[] data;
/*
* Flags: bit fields
*
* -Dirty means that the in-memory version is not present on disk.
* -The last logged bits store the total size of the last logged entry.
*/
private static final int DIRTY_BIT = 0x80000000;
private static final int CLEAR_DIRTY_BIT = ~DIRTY_BIT;
private static final int LAST_LOGGED_SIZE_MASK = 0x7FFFFFFF;
private static final int CLEAR_LAST_LOGGED_SIZE = ~LAST_LOGGED_SIZE_MASK;
private int flags; // not persistent
这样最终log到文件中的entry是如下所示:
这里我dump了一个做为示例:
<entry lsn="0x0/0xdd5" type="LN/7" prev="0xdb5">
<ln><node>12</node><data>hidden</data></ln>
<dbId id="3"/>
<key v="50 50 54 55 48 52 53 56 "/>
</entry>
具体访问时,将根据Lsn这个唯一的标识定位,读取entry返回相关的值。
参考文献
1.Berkeley DB Java Edition Architecture
2.Source Code
3.Log-Structured File System
- 大小: 4.8 KB
- 大小: 13.5 KB
- 大小: 13.8 KB
- 大小: 19.2 KB
- 大小: 3.1 KB
分享到:
相关推荐
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。 多线程支持,JE使用超时的方式来处理...
Berkeley DB Java Edition(以下简称JE)是由美国Sleepycat Software公司(后被Oracle公司收购)开发的一套开放源码的嵌入式数据库,它采用K/V存储,能为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务
Berkeley DB Java Edition (JE) 官方7.5.11下载版本。 相关介绍 https://blog.csdn.net/hadues/article/details/80854288
oracle 官方实现的 基于B+树 文件磁盘 数据存储 的文件数据库。
很好用的NoSQL 数据库, google 使用此数据库存储自己的用户信息, 它能够处理海量数据,效率高
#资源达人分享计划#
Java版本的Berkeley DB用户手册,找了好久
Oracle Berkeley DB Java 版是一个开源的、可嵌入的事务存储引擎,是完全用 Java 编写的。与 Oracle Berkeley DB 类似,Oracle Berkeley DB Java 版在应用程序的地址空间中执行,没有客户端/服务器通信的开销,从而...
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。
NULL 博文链接:https://xpenxpen.iteye.com/blog/2124921
Berkeley DB Java Edition JE 是一个完全用JAVA写的 它适合于管理海量的 简单的数据 能够高效率的处理1到1百万条记录 制约JE数据库的往往是硬件系统 而不是JE本身 多线程支持 JE使用超时的方式来处理线程间的死琐...
自己稍微封装了一下,可以当成简单的map来使用。
这个是最流行的嵌入式高性能开源数据库内核开发包,java企业开发必备。
NULL 博文链接:https://rensanning.iteye.com/blog/1872481
嵌入式数据库Berkeley DB Java Edition Berkeley DB的使用 使用Berkeley DB的一般步骤 创建、打开、操作、关闭数据库环境Environment
使用BerkeleyDB数据库,java语言开发需要的jar包资源,7.5.11版本
Berkeley DB Java Edition (JE)是一个完全用JAVA 写的,它适合于管理海量的,简单的 数据。 l 能够高效率的处理 1 到 1 百万条记录,制约 JE 数据库的往往是硬件系统,而不是 JE 本身。 多线程支持,JE 使用超时的...
Java-Edition-BerkeleyDB-3.1.0,国外的开源数据库,供大家参考
Berkeley DB Berkeley DB(BDB)是一个高效的嵌入式数据库编程库,C语言、C++、Java、Perl、Python、...#oracle 介绍关于berkeleydb http://www.oracle.com/technetwork/cn/database/berkeleydb/index-085507-zhs.html