天天看點

H2 架構初探

H2 架構初探

H2是一個純Java編寫的資料庫,具體就是一個jar,支援嵌入式和Client/Server兩種模式,使用起來非常友善。由于其使用純java編寫,并且隻有1.4M左右大小,比起同樣規模的C系列資料庫(如sqlite)更适合作為學習資料庫原理的入門級源碼。

下面結合H2文檔來分析H2的總體架構。H2總共有20多個包,按照其功能從上到下劃分分别是:

1. JDBC驅動

2. 連接配接和會話管理

3. SQL解析器

4. 指令執行和規劃器

5. 表/索引/限制

6. 事務與日志

7. B樹及資料庫頁為基礎的實體存儲

8. 檔案抽象

JDBC驅動

實作于org.h2.jdbc和org.h2.jdbcx。這兩個包中大概有, 結構比較簡單基本可以作為JDBC流程和實作的範例來學習。

連接配接和會話

連接配接與會話相關的類主要有以下幾個

作用
org.h2.engine.Database 全局接口類,為操作入口
org.h2.engine.SessionInterface 會話接口
org.h2.engine.Session 本地和嵌入式會話
org.h2.engine.SessionRemote 遠端會話

解析器

H2的解析器實作是一種從上到下遞歸解析的政策,在org.h2.command.Parser類中實作,基本可以看到的是一個if/else大集合。

指令執行規劃器

與其他資料庫實作不同,指令規劃部分在其他資料庫會解析為中間語言,即虛拟機層,但是h2會直接将其解析為對應的指令并執行(是否意味着其查詢優化很弱?有待驗證。。。)。相應存在于兩個包。包名很形象,沒啥好說。

作用
org.h2.ddl 資料定義
org.h2.dml 資料操作

表/索引/限制

沒啥特點,唯一可以提的是索引是作為一種特殊表實作的

作用
org.h2.table
org.h2.index 索引

事務與日志

事務日志、撤銷與重做日志,其中事務日志全部會話共享,撤銷與重做日志每個會話一個。在MvStore(多版本存儲,H2新的存儲實作)中,隻有事務日志。

B樹及資料庫頁為基礎的實體存儲

實作于org.h2.store,現在預設不用,預設使用org.h2.mvstore.*包中實作的存儲方式。主要使用了一mvstore(Muti-version store)為多版本的B樹存儲方式,優化了并發更新的問題。

檔案抽象

舊版本實作于org.h2.store.FileStore, 新版本在org.h2.mvstore.FileStore,抽象了記憶體資料庫、磁盤資料庫、壓縮檔案資料庫等等。