Hibernate H2 數據庫連接配置 URL 解讀

H2 是我們常使用的一個內存數據庫,通常這個數據庫能夠幫助我們在測試的時候進行邏輯測試。

如果你使用了 Hibernate 的話,首先需要設置數據庫的連接,因爲 H2 可以支持內存模式,也可以支持文件模式,我們下面分別對這 2 種模式的配置參數進行一些解讀。

image-3

內存模式

我們可以使用下面的配置的字符串來進行內存模式的配置:

hibernate.connection.url=jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=RUNSCRIPT FROM 'classpath:schema/h2.sql'
針對內存模式,需要了解下面的重點,在 JVM 進程啓動後,將會在內存中創建一個數據庫,當 JVM 內存釋放後,你的程序將會關閉最後的連接,當 H2 直到最後的連接被關閉後,H2 數據庫將會自動從內存中刪除。

jdbc:h2:mem:test

上面的命令將會在內存中創建一個 test 的數據庫,這個參數中的 mem 表示的是內存中創建。

MODE=MySQL

創建的數據庫使用 MySQL 兼容模式,這樣如果你需要對數據庫遷移到基於服務器的 MySQL 數據庫上的話,你不需要對你的邏輯代碼和實體進行修改。

DB_CLOSE_DELAY=-1

在默認情況下,H2 將會在最後的連接退出的時候關閉數據庫。針對基於內存的數據庫配置的情況下,如果在這個情況下還進行數據庫連接的話,很有可能程序將會得到連接丟失的錯誤,如果你使用了連接池的話,通常在 JVM 退出之前,連接池都會保持有數據庫連接,因此這個問題針對使用連接池的情況可能不存在。

如果你沒有使用連接池的話,建議將這個參數設置爲: ;DB_CLOSE_DELAY=-1 這樣能夠保證在虛擬機退出之前 H2 數據庫不關閉連接。

DB_CLOSE_ON_EXIT=FALSE

這個參數的默認配置爲 TRUE。
在默認情況下,H2 將會在最後的連接退出的時候關閉數據庫,如果在這個情況下數據庫沒有被關閉的話,H2 將會在虛擬機退出的時候關閉數據庫。

但是在一些特殊的情況下,我們並不希望虛擬機在退出的時候關閉數據庫,比如說你還需要使用數據庫寫入一些虛擬機的情況,或者寫入虛擬機的關閉過程等。

因此,在這個情況下,你需要講這個參數配置爲 TRUE。

INIT=RUNSCRIPT FROM ‘classpath:schema/h2.sql’

初始化 SQL 腳本。

通常我們會在這裏配置一個初始化的腳本,因爲內存數據庫在初始化成功後是不會創建數據表和初始化數據的,因此我們需要讓第一個鏈接在鏈接數據庫後直接運行一個腳本來創建數據庫,表,同時插入一些數據。

這個配置是在這裏設置,classpath: 就是你當前項目的 resources 目錄中。

如果下圖所示的目錄結構。

 

2021-11-22_11-58-48

 

文件模式

文件模式的情況能夠讓你的測試數據在文件系統中持久化。

這種模式通常能夠讓有機會在程序退出的時候檢查數據處理是否準確,存儲和更新是否有問題。

hibernate.connection.url=jdbc:h2:file:~/h2/test;MODE=MySQL;AUTO_SERVER=TRUE

請參考上面的配置參數,和下面的一些解讀。

jdbc:h2:file:~/h2/test

這個配置參數會告訴 H2 在文件系統中創建一個數據庫,創建的路徑爲 ~/h2/test

具體來說,如果你使用的是 Windows 系統,並且當前登錄的用戶名爲 huyuc,那麼創建的數據庫文件的路徑爲:C:\Users\huyuc\h2

AUTO_SERVER=TRUE

這個配置模式爲 Automatic Mixed Mode。

用土話說就是允許多個進程同時訪問數據庫。

舉例來說,如你運行一個測試環境,但是又想用一個 UI 工具來查看數據庫中的數據情況,這個時候你需要講這個配置參數設置爲 TRUE。

因爲這裏是 2 個進程同時訪問數據庫,否則你將會得到數據庫文件被佔用的錯誤。

 

https://www.ossez.com/t/hibernate-h2-url/13816

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章