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,抽象了記憶體資料庫、磁盤資料庫、壓縮檔案資料庫等等。