無聊的筆記:之三(使用H2內嵌式數據庫)


簡介

H2數據庫是一個純用java開發的開源數據庫。只有一個類庫(即只有一個2M大小的 jar 文件),可以直接嵌入到應用項目中。

已經了解並決定使用H2的小伙伴請跳過這里瞎扯,直接看到下面 使用h2數據庫

H2數據庫有很多優點,官網是這么說的:

  • Very fast, open source, JDBC API(速度賊拉快,開源免費可以白嫖,支持JDBC)
  • Embedded and server modes; in-memory databases(可以當作內嵌數據庫來使用,像Sqlite那樣;可以當作客戶-服務端數據庫來使用,像MySql、Postgresql那樣;可以當作內存/緩存數據庫)
  • Browser based Console application(支持瀏覽器的控制台應用,不用額外安裝任何桌面應用程序。)
  • Small footprint: around 2 MB jar file size(只要一個2MB大小的jar包就可以使用)

H2數據庫特性

下面表格內的數據來自官網:https://h2database.com/html/main.html

H2 Derby HSQLDB MySQL PostgreSQL
Pure Java Yes Yes Yes No No
Memory Mode Yes Yes Yes No No
Encrypted Database Yes Yes Yes No No
ODBC Driver Yes No No Yes Yes
Fulltext Search Yes No No Yes Yes
Multi Version Concurrency Yes No Yes Yes Yes
Footprint (embedded) ~2 MB ~3 MB ~1.5 MB 不支持 不支持
Footprint (client) ~500 KB ~600 KB ~1.5 MB ~1 MB ~700 KB

為什么要使用 H2 ?

在java開發的時候尤其還在測試階段,再安裝其他的數據庫比較麻煩。這時候可以使用 H2 數據庫來臨時代替那些 OracleMySqlPostgresql 等主流的數據庫,因為他只需要導入一個 jar 包就能用了。

或者你要開發的程序規模不是很大,最多幾十萬的數據量,這時候 H2 的性能也完全可以 hold 住。

還有一個好處就是 H2 數據庫提供了一個網頁版的數據庫管理工具。如果只使用簡單的 SQL 語句,可以省去安裝 navicatphpMyAdmin 這類軟件。(這個小工具還挺好用,不僅能鏈接h2數據庫,還能鏈接 MySql、Postgresql、SQLLite等多種數據庫)

他長下面那樣:

h2數據庫數據管理工具
h2數據庫數據管理工具

總之,方便就是了。

H2的幾種使用方式

  1. 嵌入式模式(使用 JDBC 的本地連接)
    類似HSQLDB、Derby、SQLite等可以集成到程序中,而不要安裝額外的數據庫軟件。

  2. 服務器模式(使用 JDBC 或 ODBC 在 TCP/IP 上的遠程連接)

  3. 混合模式(本地和遠程連接同時進行)

應用場景總結

  • 可以同應用程序打包在一起發布,在儲存的數據量不大的情況下,避免再安裝其他數據庫等繁瑣的操作。
  • 可用於單元測試。
  • 可以用作緩存,即當做內存數據庫,。

H2數據庫與其他主流數據庫性能比較

以下測試內容來自官方測試數據。下面的表格分別將H2與其他數據的運行時間和系統內存使用情況進行了對比測試。
數據只有部分內容,查看完整內容請至:https://h2database.com/html/performance.html

內嵌數據庫之間的較量(對比的HSQLDB和Derby兩個數據庫也都是用java開發的嵌入式數據庫):

測試內容 單位 H2數據庫 HSQLDB數據庫 Derby數據庫
Simple: Init ms 1019 1907 8280
Simple: Query (random) ms 1304 873 1912
Simple: Query (sequential) ms 835 1839 5415
Simple: Update (sequential) ms 961 2333 21759
Simple: Delete (sequential) ms 950 1922 32016
Simple: Memory Usage MB 21 10 8

客戶-服務端數據庫之間的較量:

測試內容 單位 H2(Server模式) HSQLDB數據庫 Derby數據庫 PostgreSQL數據庫 MySql數據庫
Simple: Init ms 16338 17198 27860 30156 29409
Simple: Query (random) ms 3399 2582 6190 3315 3342
Simple: Query (sequential) ms 21841 18699 42347 30774 32611
Simple: Update (sequential) ms 6913 7745 28576 32698 11350
Simple: Delete (sequential) ms 8051 9751 42202 44480 16555
Simple: Memory Usage MB 22 11 9 0 1

H2數據庫還是有缺點的。比如從上面就可以看出來內存使用明顯比其他的要多,而且據說在以前的版本中出現過數據丟失的或者損壞的情況,但是stackoverflow上的大佬說1.2.147版本以后,就沒發生過數據損壞或者缺失的情況(沒親身測試過,但是現在都1.4+版本了,因該不會有什么問題)。

H2相關鏈接

使用H2數據庫

1. 下載安裝

  • 下載安裝 H2
    官網地址:https://h2database.com/html/download.html

    在下載頁面有下面兩個 下載 選項:

    Version 1.4.200 (2019-10-14)
    -------------------------------------------------------------------------------------------
    Windows Installer (SHA1 checksum: 12710a463318cf23c0e0e3f7d58a0f232bd39cfe)
    Platform-Independent Zip (SHA1 checksum: 5898966bbca0b29ee02602fb84e0eb90ec92eec2)
    ......
    

    第一個是windows的安裝程序。第二個是一個壓縮包,相當於“綠色版”,無需安裝。

    這里下載第二個。

  • 目錄介紹
    將下載的zip包解壓后得到以下目錄結構(現在是2020-10,使用的是2019-10-14 1.4.200 版本,以后或者其他版本可能會有不同)。

    |- bin
       |- h2.bat
       |- h2w.bat
       |- h2.sh
       |- h2-1.4.200.jar
    |- docs
    |- service
    |- src
    |- build.bat
    |- build.sh
    

    說明:
    docs : 是H2說明文檔的離線版本,里面都是些 html/pdf 之類的文件。
    service : 通過wrapper包裝成服務相關文件。
    src : H2數據庫的源代碼
    build.bat : windows構建腳本
    build.sh : linux構建腳本
    bin -> h2.bat : windows啟動腳本(啟動時會有個黑窗口在那里)
    bin -> h2w.bat : windows啟動腳本,后台靜默啟動(啟動后沒有黑窗口)
    bin -> h2.sh : linux啟動腳本
    bin -> h2-1.4.200.jar : 打包好的jar包。如果想要嵌入到你的程序中,只要引入這個jar就可以了(或者使用maven/gradle等)。

2. 使用 H2 Shell 工具啟動數據庫。

在 bin 目錄下運行java -cp h2-xxx.jar org.h2.tools.Shell,只要根據引導程序,就可以一步一步的創建數據庫。

如下:

PS C:\h2\bin> java -cp .\h2-1.4.200.jar org.h2.tools.Shell

Welcome to H2 Shell 1.4.200 (2019-10-14)
Exit with Ctrl+C
[Enter]   jdbc:h2:~/test
URL
[Enter]   org.h2.Driver
Driver
[Enter]   sa
User
Password
Connected
Commands are case insensitive; SQL statements end with ';'
help or ?      Display this help
list           Toggle result list / stack trace mode
maxwidth       Set maximum column width (default is 100)
autocommit     Enable or disable autocommit
history        Show the last 20 statements
quit or exit   Close the connection and exit

sql> select * from test
...

上面的操作中,創建 test 數據庫。 JDBC URL鏈接方式為:jdbc:h2:~/test。這會在用戶目錄下生成一個 test.mv.db 文件,這個文件就是數據庫文件。並設置數據庫管理員為 sa ,密碼為空(只有本地模式,才支持空密碼)。

如果不想將數據庫文件創建在用戶目錄下,可以使用jdbc:h2:[file:][<path>]<databaseName>格式指定數據庫保存路徑。

如果要直接在內存中創建數據庫,而將數據持久化到本地保存,則使用 jdbc:h2:mem:<databaseName> 格式。

H2還支持其他Database URL寫法,參考官網:Database URL

用戶目錄,windows為:C:\Users\登錄的用戶名

提示:

  • 使用本地格式 url (如:jdbc:h2:~/test)鏈接 H2 ,如果沒有此數據庫,則會自動創建這個數據庫(遠程連接情況下則默認報錯)。如果要禁止默認創建不存在的數據的這種行為,可以在 URL 后添加 ;IFEXISTS=TRUE 即可,如 jdbc:h2:/data/sample;IFEXISTS=TRUE

3. 以Server模式啟動H2數據庫

雙擊h2.bat啟動數據庫,會自動用默認瀏覽器打開數據庫管理頁面。如果沒自動打開,也可以手動在瀏覽器輸入URL:http://localhost:8082進入數據庫管理頁面。(見上面的截圖)

設置數據庫端口號等配置的配置文件在用戶目錄有個 .h2.server.properties 文件,如:C:\Users\zhangsan.h2.server.properties

使用這種方式啟動 h2 后,右下角會有個黃色的小的數據庫圖標可以用來創建數據庫/或者打開數據庫控制台頁面等(如下圖)。

右擊數據庫圖標:

  • H2 Console - 點擊打開瀏覽器 Console
  • Create a new Database... - 點擊彈出窗口來創建數據庫
  • Status - 顯示瀏覽器鏈接數據庫鏈接
  • Exit

使用h2.bat打開的黑窗口不要關,要想不要黑色窗口可以雙擊h2w.bat啟動。
h2數據庫還有其他方式啟動,這里不做詳細介紹了,有興趣的可以看官方文檔。

4. 在項目中使用 H2 數據庫

你可以直接把上面下載的H2數據庫的jar包復制到項目的lib中,或者使用Maven來管理。

Maven依賴

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>1.4.200</version>
</dependency>

數據庫配置:

//數據庫連接URL
private static final String JDBC_URL = "jdbc:h2:~/test";
//用戶名
private static final String USER = "sa";
//密碼
private static final String PASSWORD = "";
//數據庫驅動
private static final String DRIVER_CLASS="org.h2.Driver";

使用JDBC操作H2數據庫

public class H2ConnTest1 {
    //數據庫連接URL
    private static final String JDBC_URL = "jdbc:h2:~/test";
    //用戶名
    private static final String USER = "sa";
    //密碼
    private static final String PASSWORD = "";
    //數據庫驅動
    private static final String DRIVER_CLASS="org.h2.Driver";
    
    public static void main(String[] args) throws Exception {
        // 加載H2數據庫驅動
        Class.forName(DRIVER_CLASS);
        // 根據連接URL,用戶名,密碼獲取數據庫連接
        Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
        Statement stmt = conn.createStatement();
        //如果存在USER_INFO表就先刪除USER_INFO表
        stmt.execute("DROP TABLE IF EXISTS PERSON");
        //創建USER_INFO表
        stmt.execute("CREATE TABLE PERSON(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
        //新增
        stmt.executeUpdate("INSERT INTO PERSON VALUES('" + UUID.randomUUID()+ "','張三','男')");
        
        //刪除
        stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='張三'");
        //修改
        stmt.executeUpdate("UPDATE USER_INFO SET name='張三' WHERE name='王二麻子'");
        //查詢
        ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
        //遍歷結果集
        while (rs.next()) {
            System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
        }
        //釋放資源
        stmt.close();
        //關閉連接
        conn.close();
    }
}

當程序運行起來的時候,會自動啟動 H2 數據庫,如果url格式是本地格式,會自動創建數據庫。其他操作和常規MySQL、Postgresql數據庫相似。
要注意的是如果你只在測試階段使用 H2 數據庫,而生產階段將會替換成其他數據庫的話,你要注意他們二者之間的區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM