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、服務器模式
服務器模式,也被稱爲 遠程模式 或 客戶端/服務器 模式,應用程序使用 JDBC
或 ODBC API
遠程(TCP/IP
傳輸)訪問數據庫。類似於傳統數據庫mysql、oracle。
實際上,H2 Server本身也是使用嵌入式模式來啓動運行H2 Database的。由於服務器模式是通過遠程(TCP/IP
傳輸)連接訪問數據,其性能要低於嵌入式模式。
每個服務器併發打開的數據庫數或打開的連接數沒有限制。
服務器模式:通過 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_OUT
、TRACE_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)下載
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
5、選擇中文語言,並點擊連接,自動創建test數據庫,數據庫文件在~
目錄中,~
代表 用戶自己目錄
。
6、複製測試腳本sql,並執行
7、運行結果如下:
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、運行測試類,結果如下: