准備工作
1、下載JDK(本人下載的版本號為JDK1.7)、環境變量設置JAVA_HOME。設置PATH(%JAVA_HOME%\bin%)。
2、下載並解壓:h2-2014-07-13.zip 官網下載地址:http://www.h2database.com/html/main.html
3、環境變量設置H2_HOME。
%H2_HOME%表示為解壓的文件文件夾。執行%H2_HOME%\bin\h2.bat 將會自己主動打開以下網址。
(請確認是否安裝了jdk,並設置了JAVA_HOME環境變量)
http://localhost:8082/login.jsp?jsessionid=244e36a683f97f0d4f3b000f33530ed1
3、點擊 connect ,登錄。
4、運行上圖中紅色部分sql語句,成功創建test表。
由於沒有指定數據庫文件位置。會自己主動輸出到輸出到C:\Users\Administrator下。
H2文件結構
%H2_HOME%
-h2
-bin
h2-1.3.154.jar //jar包
h2.bat //Windows控制台啟動腳本
h2.sh //Linux控制台啟動腳本
h2w.bat //Windows控制台啟動腳本(不帶黑屏窗體)
+docs 幫助文檔
+service //通過wrapper包裝成服務。
+src //源碼
build.bat windows構建腳本
build.sh linux構建腳本
H2的使用
支持Embedded。server和in-memory模式以及內存模式。
Embedded模式
1、新建java project工程 H2Test。
2、%H2_HOME%\bin\h2-1.3.154.jar 拷貝到 \H2Test\lib下。並增加project引用。
3、新建Generic H2 (Embedded)數據庫。指定:JDBC URL:jdbc:h2:E:\research\workspace\H2Test\db\test。然后運行上面的test sql語句,來創建一個test表。
4、新建 TestH2類 主要代碼
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:E:\\research\\workspace\\H2Test\\db\\test", "sa", "");
// add application code here
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST ");
while(rs.next()) {
System.out.println(rs.getInt("ID")+","+rs.getString("NAME"));
}
conn.close();
}
server模式
1、直接將jdbc url 改為:jdbc:h2:tcp://localhost/~/test 即可了。由於我們在上面第一步的時候已經在C:\Users\Administrator創建了test數據庫。
你也能夠再創建新的數據庫,默認都是保存在C:\Users\Administrator下的。
注意:你必須啟動服務:%H2_HOME%\bin\h2.bat 或者 以服務模式啟動:%H2_HOME%\service\0_run_server_debug.bat ,里面有好幾個腳本把H2部署為服務模式。每次機器啟動后自己主動啟動H2服務。
2、新建 TestServerH2類 主要代碼
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:tcp://localhost/~/test", "sa", "");
// add application code here
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST ");
while(rs.next()) {
System.out.println(rs.getInt("ID")+","+rs.getString("NAME"));
}
conn.close();
}
執行的結果和上面一樣。
內存模式(數據僅僅保存在內存中)
1、新建 TestMemH2類 主要代碼
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:tcp://localhost/mem:test2", "sa", "");
// add application code here
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE TEST_MEM(ID INT PRIMARY KEY,NAME VARCHAR(255));");
stmt.executeUpdate("INSERT INTO TEST_MEM VALUES(1, 'Hello_Mem');");
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_MEM");
while(rs.next()) {
System.out.println(rs.getInt("ID")+","+rs.getString("NAME"));
}
conn.close();
}
控制台打印出:1,Hello_Mem
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
集群 / 高可用性
數據庫支持簡單的集群/高可用性機制。架構是:兩個數據庫服務執行在兩台不同的計算機上,兩台計算機有相同數據庫的副本,假設兩個server都處於執行狀態,每一個數據庫操作都被在兩台計算機上執行,假設一台server宕機(斷電、硬件故障、網絡故障等),另外一台計算機仍能提供服務,從這一刻開始,數據庫操作僅在一台server上執行,直到另外一台server恢復執行。
集群僅能用於server模式(內嵌模式並不支持集群)。能夠在數據庫執行狀態下恢復集群。可是要求在第二個數據庫恢復期間沒有應用在改變第一個數據庫的數據,因此恢復集群是一個手工的過程。
初始化集群,使用以下的步驟:
· 創建數據庫
· 使用CreateCluster工具創建一個數據庫福分到另外的地方,而且初始化集群,這樣就得到了相同數據的兩個數據庫
· 啟動兩個數據庫服務(每一個數據庫的副本)
· 如今能夠通過應用client連接到數據庫
使用創建集群工具
要了解集群怎樣工作,請嘗試以下的樣例,在這個樣例里,兩個數據庫駐留在同一台計算機上,但通常,兩個數據庫在不同的計算機上。
· 創建兩個文件夾:server1,server2。
每一個文件夾將模擬一台計算機
· 在第一個文件夾啟動TCP服務。你能夠執行以下的命令:
· java org.h2.tools.Server
· -tcp-tcpPort 9101
· -baseDirserver1
· 在第二個文件夾啟動TCP服務,模擬第二個server(冗余執行),你能使用以下的命令:
· java org.h2.tools.Server
· -tcp-tcpPort 9102
· -baseDirserver2
· 使用 CreateCluster 工具初始化集群,假設數據庫不存在。將創建一個新的空數據庫。執行以下命令行:
· java org.h2.tools.CreateCluster
· -urlSourcejdbc:h2:tcp://localhost:9101/~/test
· -urlTargetjdbc:h2:tcp://localhost:9102/~/test
· -user sa
· -serverList localhost:9101,localhost:9102
· 應用或者是H2控制台能夠通過以下的JDBC的URL連接數據庫:jdbc:h2:tcp://localhost:9101,localhost:9102/~/test
· 假設你停止一個服務(通過殺進程),你注意到還有一個機器繼續工作,數據庫仍能提供訪問。
· 恢復集群。你須要先刪掉宕機的數據庫。然后重新啟動宕機的數據庫的服務,再又一次執行CreateCluster集群工具。
檢測執行狀態下的集群
查找哪些節點當前正在執行。通過執行以下的SQL語句:
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERENAME='CLUSTER'
結果返回為 '' (兩個單引號),說明集群模式被屏蔽,否則,集群服務器列表將被單引號包含着返回。如'server1:9191,server2:9191'。
2、上面的 URL 改為 jdbc:h2:~/mem:test 也是能夠的。假設是localhost必須啟動服務。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
數據庫連接 URL說明
數據庫支持多種連接模式和連接設置,不同的連接模式和連接設置是通過不同的URL來區分的,URL中的設置是不區分大寫和小寫。
Topic |
URL Format and Examples |
jdbc:h2:[file:][<path>]<databaseName> |
|
jdbc:h2:mem: |
|
jdbc:h2:mem:<databaseName> |
|
使用TCP/IP的服務器模式(遠程連接)
|
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> |
|
jdbc:h2:ssl://<server>[:<port>]/<databaseName> |
jdbc:h2:<url>;CIPHER=[AES|XTEA] |
|
jdbc:h2:<url>;FILE_LOCK={NO|FILE|SOCKET} |
|
jdbc:h2:<url>;IFEXISTS=TRUE |
|
jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE |
|
jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>] |
|
jdbc:h2:<url>;LOG=2 |
|
jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3> |
|
jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE |
|
jdbc:h2:<url>;ACCESS_MODE_LOG=rws;ACCESS_MODE_DATA=rws |
|
在Zip文件里的數據庫 |
jdbc:h2:zip:<zipFileName>!/<databaseName> |
jdbc:h2:<url>;MODE=<databaseType> |
|
jdbc:h2:<url>;AUTO_RECONNECT=TRUE |
|
jdbc:h2:<url>;AUTO_SERVER=TRUE |
|
jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] |