H2 是一個使用 Java 編寫的資料庫,支援記憶體、檔案等資料儲存模式,可用於測試及 Demo 應用;本文主要介紹其基本概念及安裝。
1、H2 特點
- 速度很快、開源、JDBC API
- 嵌入式和伺服器模式;基於磁碟或記憶體的資料庫
- 事務支援,多版本併發
- 基於瀏覽器的控制檯應用程式
- 加密資料庫
- 全文搜尋
- 純 Java,並且體積小:約 2.5 MB 的 jar 檔案
- ODBC 驅動程式
2、連線模式
H2 支援以下連線模式:
嵌入式模式(使用 JDBC 進行本地連線)
伺服器模式(透過 TCP/IP 上的 JDBC 或 ODBC 進行遠端連線)
混合模式(同時進行本地和遠端連線)
2.1、嵌入式模式(Embedded Mode)
在嵌入式模式中,應用程式使用 JDBC 從同一個 JVM 中開啟資料庫。這是最快速、最簡單的連線模式。缺點是資料庫一次只能在一個虛擬機器中開啟。與所有模式一樣,持久化資料庫和記憶體資料庫都受支援。併發開啟資料庫的數量或開啟連線的數量沒有限制。
在嵌入式模式中,SQL 命令的 I/O 操作可以由應用程式的執行緒執行。應用程式不應中斷這些執行緒,否則可能導致資料庫損壞,因為 JVM 線上程中斷時會關閉 I/O 控制代碼。可以考慮其他方法來控制應用程式的執行。當中斷可能發生時,非同步檔案系統可以作為一種解決方法,但不能保證完全安全。建議改用客戶端-伺服器模型,客戶端端可以中斷自己的執行緒。
2.2、伺服器模式(Server Mode)
當使用伺服器模式(有時稱為遠端模式或客戶端/伺服器模式)時,應用程式使用 JDBC 或 ODBC API 遠端開啟資料庫。需要在同一或另一個虛擬機器中啟動伺服器,或者在另一臺計算機上啟動伺服器。透過連線到該伺服器,許多應用程式可以同時連線到同一個資料庫。在內部,伺服器程序以嵌入式模式開啟資料庫。
伺服器模式比嵌入式模式慢,因為所有資料都透過 TCP/IP 傳輸。與所有模式一樣,支援持久化資料庫和記憶體資料庫。每個伺服器併發開啟的資料庫數量或開啟連線的數量沒有限制。
2.3、混合模式(Mixed Mode)
混合模式是嵌入式模式和伺服器模式的組合。在一個應用程式以嵌入式模式連線資料庫,同時啟動資料庫服務,以便其他應用程式(在不同程序(虛擬機器)中執行)可以同時訪問相同的資料。本地連線的速度與僅使用嵌入式模式的資料庫一樣快,而遠端連線稍慢一些。
資料庫可以從應用程式內部(使用資料庫 API)啟動和停止,也可以自動啟動(自動混合模式)。在使用自動混合模式時,所有想要連線到資料庫的客戶端(無論是本地還是遠端連線)都可以使用完全相同的 URL 進行連線。
3、H2 伺服器型別
H2 支援三種伺服器:Web 伺服器(用於 H2 控制檯)、TCP 伺服器(用於客戶端/伺服器連線)和 PG 伺服器(用於 PostgreSQL 客戶端);只有 Web 伺服器支援瀏覽器連線。這些伺服器可以透過命令列和 API 的方式啟動。啟動伺服器並不會開啟資料庫——資料庫會在客戶端連線時開啟。
4、H2 資料庫型別
H2 支援支援資料庫和記憶體資料庫。
4.1、持久資料庫
持久資料庫資料儲存在檔案中,嵌入式的連線 URL 為:"jdbc:h2:[file:][<path>]<databaseName>",遠端連線的 URL 為:"jdbc:h2:tcp://<server>[:<port>]/[file:][<path>]<databaseName>"。字首file:是可選的;如果未使用路徑或只使用相對路徑,則當前工作目錄將被用作起點。路徑和資料庫名稱的區分大小寫取決於作業系統,但建議僅使用小寫字母。資料庫名稱必須至少為三個字元長(File.createTempFile的限制)。
4.2、記憶體資料庫
對於某些用例(例如:快速原型設計、測試、高效能操作、只讀資料庫),可能不需要持久化資料。H2 支援記憶體模式,其中資料不會被持久化。
某些情況下,只需要一個到記憶體資料庫的連線。這意味著要開啟的資料庫是私有的。在這種情況下,資料庫 URL 是 "jdbc:h2:mem:",在同一虛擬機器中開啟兩個連線意味著開啟兩個不同的(私有)資料庫。
有時需要多個連線到同一個記憶體資料庫;在這種情況下,資料庫 URL 必須包含一個名稱。例如:"jdbc:h2:mem:db1",使用此 URL 訪問相同的資料庫僅在同一虛擬機器中有效。
要從另一個程序或另一臺計算機訪問記憶體資料庫,需要在建立記憶體資料庫的同一程序中啟動一個 TCP 伺服器。然後,其他程序透過 TCP/IP 或 TLS 訪問資料庫,使用類似於 "jdbc:h2:tcp://localhost/mem:db1" 的 URL。
預設情況下,關閉資料庫的最後一個連線會關閉資料庫。對於記憶體資料庫,這意味著內容會丟失。要保持資料庫處於開啟狀態,請在 URL 中新增”;DB_CLOSE_DELAY=-1“,如:"jdbc:h2:mem:test;DB_CLOSE_DELAY=-1";這樣可在虛擬機器存活期間保持記憶體資料庫的內容。
5、資料庫連線 URL
H2 資料庫支援多種連線模式和連線設定,可以透過不同的資料庫URL實現。URL中的設定不區分大小寫。
連線方式 | 連線 URL |
嵌入式(本地)連線 |
jdbc:h2:[file:][<path>]<databaseName> |
記憶體模式(私有的) |
In-memory (private) |
記憶體模式(命名的) |
jdbc:h2:mem:<databaseName> |
伺服器模式(遠端連線) 使用 TCP/IP |
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> |
伺服器模式(遠端連線) 使用 TLS |
jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName> |
使用加密檔案 |
jdbc:h2:<url>;CIPHER=AES |
6、安裝
6.1、伺服器模式
官網(https://h2database.com/html/download.html)下載 H2 安裝檔案,這裡下載平臺無關的 Zip 安裝檔案;下載完成後解壓並執行 bin/h2.bat 命令,該命令會啟動所有三種伺服器: Web 伺服器(埠 8082)、TCP 伺服器(埠 9092)、PG 伺服器(埠 5435)。啟動後會自動彈出 H2 控制檯的頁面:
6.2、嵌入式或混合模式
引入相關依賴即可:
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.2.224</version> </dependency>
參考:
https://h2database.com/html/main.html