介绍
H2在基于B树的磁盘存储之上实现了一个嵌入式且独立于ANSI-SQL89的SQL引擎。
截至2013年10月,Thomas仍在开发名为MVStore的下一代存储引擎。 这将及时替换基于B树的存储引擎。
自顶向上概述
从上至下工作,各层如下所示:
- JDBC driver.
- Connection/session management.
- SQL Parser.
- Command execution and planning.
- Table/Index/Constraints.
- Undo log, redo log, and transactions layer.
- B-tree engine and page-based storage allocation.
- Filesystem abstraction.
JDBC driver
JDBC驱动程序实现位于org.h2.jdbc,org.h2.jdbcx中
Connection/session management
主要关注的类如下:
Package | 描述 |
---|---|
org.h2.engine.Database | 根/全局类 |
org.h2.engine.SessionInterface | 嵌入式会话和远程会话抽象类 |
org.h2.engine.Session | 本地/嵌入式会话 |
org.h2.engine.SessionRemote | 远程会话 |
Parser
解析器位于org.h2.command.Parser中。 它使用简单的递归下降设计。
请参阅Wikipedia递归下降解析器页面。
Command execution and planning
与其他数据库不同,我们没有中间步骤,无法生成查询的某种IR(中间表示)。 解析器类直接生成命令执行对象。 然后,我们对命令运行一些优化步骤,以可能生成更有效的命令。 感兴趣的主要软件包是:
Package | 描述 |
---|---|
org.h2.command.ddl | 修改表结构等的命令 |
org.h2.command.dml | 修改数据的命令 |
Table/Index/Constraints
这里要注意的一件事是,索引只是作为特殊类型的表存储。
感兴趣的主要软件包是:
Package | 描述 |
---|---|
org.h2.table | 各种表的实现 |
org.h2.index | 各种索引的实现 |
Undo log, redo log, and transactions layer
我们有一个事务日志,该日志在所有会话之间共享。 也可以看看
https://en.wikipedia.org/wiki/Transaction_log/
https://h2database.com/html/grammar.html#set_log/
我们还有一个针对每个会话的撤消日志,用于撤消操作(例如,更新失败)并回滚事务。 从理论上讲,可以使用事务日志,但是为了简单起见,H2当前使用它自己的“操作列表”(通常在内存中)。
有了MVStore,就不再需要它了(只是事务日志)。
B-tree engine and page-based storage allocation.
感兴趣的主要软件包是org.h2.store。
这实现了一种存储机制,该机制分配存储页面(通常为2k大小),并在这些页面上实现b树,以允许快速检索和更新。
Filesystem abstraction
感兴趣的主要类是org.h2.store.FileStore。
这实现了随机访问文件的抽象。 这使高层可以将内存数据库,磁盘数据库和zip文件数据库相同。