h2架构解析

介绍

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文件数据库相同。