H2數據庫入門

H2介紹

H2是一個開源的嵌入式數據庫引擎,採用java語言編寫,不受平臺的限制,同時H2提供了一個十分方便的web控制檯用於操作和管理數據庫內容。

H2還提供兼容模式,可以兼容一些主流的數據庫,因此採用H2作爲開發期的數據庫非常方便。

官網地址:http://www.h2database.com/

H2是Java SQL數據庫。H2的主要特點是:

  • 非常快,開源,JDBC API
  • 嵌入式和服務器模式; 內存數據庫
  • 基於瀏覽器的Console應用
  • 佔地面積小:大約2 MB的jar文件大小
特徵 H2 Derby HSQLDB MySQL PostgreSQL
純 Java Yes Yes Yes No No
內存模式 Yes Yes Yes No No
數據庫加密 Yes Yes Yes No No
ODBC 驅動 Yes No No Yes Yes
全文搜索 Yes No No Yes Yes
多版本併發 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用途

H2最大的用途在於可以同應用程序打包在一起發佈,這樣可以非常方便地存儲少量結構化數據。

它的另一個用途是用於單元測試。啓動速度快,而且可以關閉持久化功能,每一個用例執行完隨即還原到初始狀態。

H2的第三個用處是作爲緩存,作爲NoSQL的一個補充。當某些場景下數據模型必須爲關係型,可以拿它當Memcached使,作爲後端MySQL/Oracle的一個緩衝層,緩存一些不經常變化但需要頻繁訪問的數據,比如字典表、權限表。不過這樣系統架構就會比較複雜了。

H2運行模式

H2支持三種不同的運行模式,以適用於更多不同的應用場景。

1、嵌入式模式

嵌入式模式下,H2與應用運行於同一個JVM中,H2被應用啓動。該模式也是性能最好的模式,也是官方推薦的模式。

缺點是數據庫只能隨時在一個虛擬機(和類加載器)中打開。與所有模式一樣,持久性數據庫和內存數據庫均受支持。併發打開的數據庫數或打開的連接數沒有限制。

在嵌入式模式下,I / O操作可以由執行SQL命令的應用程序線程執行。該應用程序可能不會中斷這些線程,它可能導致數據庫損壞,因爲JVM在線程中斷期間會關閉I / O句柄。考慮其他方法來控制應用程序的執行。當可能發生中斷時,可以將async: 文件系統用作解決方法,但不能保證完全安全。建議改用 客戶端-服務器 模型,客戶端可能會中斷自己的線程。

數據庫嵌入在應用程序中

嵌入式模式:使用JDBC的本地連接

數據庫持久化存儲爲單個文件。

連接字符串:

jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE

~/.h2/DBName 表示數據庫文件的存儲位置,如果第一次連接則會自動創建數據。

2、服務器模式

服務器模式,也被稱爲 遠程模式客戶端/服務器 模式,應用程序使用 JDBCODBC API 遠程(TCP/IP傳輸)訪問數據庫。類似於傳統數據庫mysql、oracle。

實際上,H2 Server本身也是使用嵌入式模式來啓動運行H2 Database的。由於服務器模式是通過遠程(TCP/IP傳輸)連接訪問數據,其性能要低於嵌入式模式。

每個服務器併發打開的數據庫數或打開的連接數沒有限制。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wXYwsXdC-1582599737369)(http://www.h2database.com/html/images/connection-mode-remote-2.png)]

服務器模式:通過 JDBC 或 ODBC 通過 TCP/IP 進行遠程連接

H2支持三種服務模式:

  • web server :此種運行方式支持使用 瀏覽器訪問 H2 Console
  • TCP server :支持 客戶端/服務器端的連接方式
  • PG server :支持PostgreSQL客戶端

啓動tcp服務連接字符串示例:

jdbc:h2:tcp://localhost/~/test 使用用戶主目錄

jdbc:h2:tcp://localhost//data/test 使用絕對路徑

3、混合模式

該模式是嵌入式模式與混合模式的融合。一個應用啓動嵌入式模式的H2 Database,其他應用可以將其作爲服務器模式來遠程訪問。

在這裏插入圖片描述

混合模式:同時進行本地和遠程連接

連接字符串參數

  • DB_CLOSE_DELAY :要求最後一個正在連接的連接斷開後,不要關閉數據庫

  • MODE=MySQL:兼容模式,H2兼容多種數據庫,該值可以爲:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQL

  • AUTO_SERVER=TRUE:啓動自動混合模式,允許開啓多個連接,該參數不支持在內存中運行模式

  • AUTO_RECONNECT=TRUE:連接丟失後自動重新連接

  • TRACE_LEVEL_SYSTEM_OUTTRACE_LEVEL_FILE:輸出跟蹤日誌到控制檯或文件, 取值0爲OFF,1爲ERROR(默認值),2爲INFO,3爲DEBUG

  • SET TRACE_MAX_FILE_SIZE mb:設置跟蹤日誌文件的大小,默認爲16M

數據庫URL連接方式

話題 URL格式和示例
嵌入式(本地)連接 jdbc:h2:[file:][<path>]<databaseName>
jdbc:h2:~/test
jdbc:h2:file:/data/sample
jdbc:h2:file:C:/data/sample (Windows only)
內存中(私有) jdbc:h2:mem:
內存中(命名) jdbc:h2:mem:<databaseName>
jdbc:h2:mem:test_mem
使用TCP / IP的服務器模式
(遠程連接)
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
jdbc:h2:tcp://localhost/~/test
jdbc:h2:tcp://dbserv:8084/~/sample
jdbc:h2:tcp://localhost/mem:test
使用TLS的服務器模式
(遠程連接)
jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName>
jdbc:h2:ssl://localhost:8085/~/sample;
使用加密文件 jdbc:h2:<url>;CIPHER=AES
jdbc:h2:ssl://localhost/~/test;CIPHER=AES
jdbc:h2:file:~/secure;CIPHER=AES
文件鎖定方法 jdbc:h2:<url>;FILE_LOCK={FILE\|SOCKET\|NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET
僅在已存在的情況下打開 jdbc:h2:<url>;IFEXISTS=TRUE
jdbc:h2:file:~/sample;IFEXISTS=TRUE
VM退出時不要關閉數據庫 jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE
在連接上執行SQL jdbc:h2:<url>;INIT=RUNSCRIPT FROM '~/create.sql'
jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM ‘~/create.sql’;RUNSCRIPT FROM ‘~/populate.sql’
用戶名和/或密碼 jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123
調試跟蹤設置 jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3>
jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3
忽略未知設置 jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE
自定義文件訪問模式 jdbc:h2:<url>;ACCESS_MODE_DATA=rws
zip文件中的數據庫 jdbc:h2:zip:<zipFileName>!/<databaseName>
jdbc:h2:zip:~/db.zip!/test
兼容模式 jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
自動重新連接 jdbc:h2:<url>;AUTO_RECONNECT=TRUE
jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE
自動混合模式 jdbc:h2:<url>;AUTO_SERVER=TRUE
jdbc:h2:~/test;AUTO_SERVER=TRUE
頁面大小 jdbc:h2:<url>;PAGE_SIZE=512
更改其他設置 jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3

H2簡單使用

1、H2數據庫下載,打開官網(http://www.h2database.com)下載

img

2、解壓下載包,即可使用,解壓後目錄如下

h2
|---bin
|  |---h2-1.1.116.jar  //H2數據庫的jar包(驅動也在裏面)
|  |---h2.bat          //Windows控制檯啓動腳本
|  |---h2.sh           //Linux控制檯啓動腳本
|  |---h2w.bat        //Windows控制檯啓動腳本(不帶黑屏窗口)
|---docs             //H2數據庫的幫助文檔(內有H2數據庫的使用手冊)
|---service         //通過wrapper包裝成服務。
|---src             //H2數據庫的源代碼
|---build.bat       //windows構建腳本
|---build.sh         //linux構建腳本

3、windows環境下運行 h2.bat,linux環境下運行 h2.sh,打開控制檯

默認情況下H2數據庫的TCP服務端口爲9092,客戶端的端口爲8082,PG服務的端口爲5435。

4、windows環境下,運行文件後自動打開瀏覽器,地址:http://本地ip:8082

img

5、選擇中文語言,並點擊連接,自動創建test數據庫,數據庫文件在~ 目錄中,~ 代表 用戶自己目錄

img

6、複製測試腳本sql,並執行

img

7、運行結果如下:

img

H2使用JDBC連接

1、運行

2、新建maven項目,引入jar包

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

3、編輯JDBC測試類

package com.test.hsqldb;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        // 加載H2 DB的JDBC驅動
        Class.forName("org.h2.Driver");

        // 鏈接數據庫,自動在~創建數據庫test,得到聯接對象 connection
        String url = "jdbc:h2:~/test";
        Connection con = DriverManager.getConnection(url, "sa", "");

        // 新建數據表
        String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
        Statement createStatement = con.createStatement();
        long f1 = createStatement.executeUpdate(ctreateTable);
        System.out.println("創建表:" + f1);

        // 插入數據
        String insertSql = "INSERT INTO test VALUES(1,'小明')";
        Statement insertStatement = con.createStatement();
        long f2 = insertStatement.executeUpdate(insertSql);
        System.out.println("插入數據:" + f2);

        // 查詢數據
        String selectSql = "select id,name from test";
        PreparedStatement prepareStatement = con.prepareStatement(selectSql);
        // 發送SQL 返回一個ResultSet
        ResultSet rs = prepareStatement.executeQuery();

        // 編歷結果集
        while (rs.next())// 從數據庫的取一行數據,是否還有下一行
        {
            int id = rs.getInt(1); // 從1開始
            String name = rs.getString(2);
            System.out.println("id:" + id + "\t名稱:" + name);
        }

        // 關閉連接
        con.close();
    }
}

4、運行測試類,結果如下:

img

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