h2database資料庫分析

遮山發表於2016-12-13

1、 原始碼結構

git source: https://github.com/h2database/h2database.git

screenshot

h2 的原始碼不是標準的maven工程,需要重新進行目錄組織生成maven工程,test目錄下的程式碼需要依賴main目錄的程式碼、tools目錄下jaqu、mode、dev目錄的程式碼。

2、啟動測試
使用embeded memory模式啟動,為了最大化資料更新的效率,停用undo/redo log,同時為了支援多執行緒訪問使用MULTI_THREAD=1 && LOCK_MODE=1 模式。

2.1 執行

伺服器啟動程式碼如下(kotlin程式碼):

Class.forName("org.h2.Driver")
val conn = DriverManager.getConnection("jdbc:h2:mem:test;LOG=0;LOCK_MODE=1;UNDO_LOG=0;MV_STORE=false;MULTI_THREADED=1", "sa", "sa")

如果LOCK_MODE = 0 不允許使用MULTI_THREAD模式,更新資料的時候是對database進行synchronized操作,容易出現競爭。

2.2 流程

這一段啟動程式碼的整個流程比較複雜:

startup_embedded
需要初始化INFOMATION_SCHEMA這個管理後設資料的Schema。之後sql的執行流程就比較簡單,把sql通過Recursive Decsent Parser解析為h2的各種command。

H2實現了ANSI-SQL89標準,並且實現了基於B-tree的儲存引擎,而MVStore是新一代的儲存引擎,用來替換基於Btree儲存引擎。

H2 邏輯處理分層:

        JDBC Driver
        Connection/Session
        SQL Parser: Recursive-descent parser
        Command解析執行:
                org.h2.command.ddl Commands that modify schema data structures
                org.h2.command.dml Commands that modify data
        Table/Index/Constrains
                org.h2.table Implementations of different kinds of tables
                org.h2.index Implementations of different kinds of indices, indexes are simply stored as special kinds of tables.
        Undo Log, redo Log, Transaction Layer: org.h2.store
        B-tree engine, MVStore engine
        FileSystem abstraction: memory or file

2.3 涉及類

h2database 把資料庫中的概念抽象為一一對應的資料模型:

h2db

初始化和執行過程中的的呼叫時序圖

h2db1

3、TODO

  • RegularTable vs MVTable的效率
  • 記憶體模式不開啟事務,如何支援 多執行緒?
  • 儲存資料結構優化:Row、Table


相關文章