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**,简称BDBJE,是由Oracle公司开发的一款高度可移植的、基于文件系统的数据存储解决方案,特别适用于需要高效、可靠且无服务器的数据管理的应用场景。这款数据库系统采用B+树作为其核心...
Berkeley DB Java Edition (JE) 官方7.5.11下载版本。 相关介绍 https://blog.csdn.net/hadues/article/details/80854288
- **Berkeley DB Java Edition的JAR文件**:这是运行BDB JE所需的核心库文件,包含所有必要的类和资源。 - **文档**:可能包括用户指南、API参考、示例代码等,帮助开发者理解和使用BDB JE。 - **示例**:提供演示...
Berkeley DB Java Edition (JE) 是一款开源的嵌入式数据库管理系统,由...总的来说,Berkeley DB Java Edition是一个强大的、轻量级的数据库解决方案,尤其适用于需要高效本地存储和事务处理能力的Java应用程序。
Berkeley DB Java Edition(JE)是一种为Java程序提供内嵌式、事务保护的数据库引擎,它继承了Berkeley DB家族的优点,包括快速、可靠和具备容错能力的数据管理特性。为了深入理解其数据存储结构,有必要对JE使用的B...
#### 一、Berkeley DB Java Edition (JE) 概述 Berkeley DB Java Edition (简称 JE) 是一款高性能、轻量级的NoSQL数据库解决方案,完全基于Java语言开发。它特别适用于需要高效管理大量简单数据的应用场景。 **...
《Berkeley DB Java Edition 4.0.92 开发包详解》 Berkeley DB Java Edition(简称BDB JE)是Oracle公司推出的一款强大的、高度可定制的嵌入式数据库系统,尤其适用于Java应用程序。这款数据库引擎以其轻量级、高...
Berkeley DB Java Edition(简称BDB JE)是一种高性能、轻量级的嵌入式数据库系统,由Oracle公司开发,广泛应用于需要快速数据存储和检索的应用场景。它并非传统的关系型数据库管理系统(RDBMS),而是一种键值对...
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。 多线程支持,JE使用超时的方式来处理...
Berkeley DB Java Edition JE 是一个完全用JAVA写的 它适合于管理海量的 简单的数据 能够高效率的处理1到1百万条记录 制约JE数据库的往往是硬件系统 而不是JE本身 多线程支持 JE使用超时的方式来处理线程间的死琐...
Oracle Berkeley DB Java 版是一个开源的、可嵌入的事务存储引擎,是完全用 Java 编写的。与 Oracle Berkeley DB 类似,Oracle Berkeley DB Java 版在应用程序的地址空间中执行,没有客户端/服务器通信的开销,从而...
这可能是BerkeleyDB Java Edition的jar文件,表示BerkeleyDB Java版的7.5.11版本。这个文件通常会包含以下组件: 1. **BerkeleyDB引擎**:这是数据库的核心部分,处理数据的读写操作,包括事务处理、并发控制、恢复...
NULL 博文链接:https://xpenxpen.iteye.com/blog/2124921
自己稍微封装了一下,可以当成简单的map来使用。
Berkeley DB Java 版本支持多种数据存储格式,包括Btree、Hash、Queue等。它也支持事务处理、锁机制和日志记录等功能,这使得它可以满足复杂的数据存储需求。 在Java应用程序中,使用Berkeley DB Java 版本可以实现...
Berkeley DB Java Edition以其简洁的键值存储模型和API,更适合快速开发简单的数据存储应用,而Apache Derby则提供了更丰富的SQL支持和关系型数据库特性,更适合需要进行复杂查询和事务处理的环境。在对象持久化方面...
文件格式** Berkeley DB的数据以文件形式存储,可以是普通磁盘文件或内存映射文件,这使得数据可以直接被应用程序访问,提高了性能。同时,BDB提供了事务处理机制,确保数据的一致性和完整性。 **3. 事务支持** ...