H2記憶體資料庫 支援儲存到檔案,
準備工作
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下,並加入工程引用。
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();
}
控制台列印出:1,Hi
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
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
叢集 / 高可用性
資料庫支援簡單的叢集/高可用性機制。架構是:兩個資料庫服務運行在兩台不同的電腦上,兩台電腦有同樣資料庫的副本,如果兩個伺服器都處於運行狀態,每個資料庫操作都被在兩台電腦上執行,如果一台伺服器宕機(斷電、硬體故障、網路故障等),另外一台電腦仍能提供服務,從這一刻開始,資料庫操作僅在一台伺服器上執行,直到另外一台伺服器恢複運行。
叢集僅能用於伺服器模式(內嵌模式並不支援叢集)。可以在資料庫運行狀態下恢複叢集,但是要求在第二個資料庫恢複期間沒有應用在改變第一個資料庫的資料,因此恢複叢集是一個手工的過程。
初始化叢集,使用下面的步驟:
· 建立資料庫
· 使用CreateCluster工具建立一個資料庫福分到另外的地方,並且初始化叢集,這樣就得到了同樣資料的兩個資料庫
· 啟動兩個資料庫服務(每個資料庫的副本)
· 現在可以通過應用用戶端串連到資料庫
使用建立叢集工具
要瞭解叢集如何工作,請嘗試下面的例子,在這個例子裡,兩個資料庫駐留在同一台電腦上,但通常,兩個資料庫在不同的電腦上。
· 建立兩個目錄:server1,server2。每個目錄將類比一台電腦
· 在第一個目錄啟動TCP服務,你可以運行下面的命令:
· java org.h2.tools.Server
· -tcp-tcpPort 9101
· -baseDirserver1
· 在第二個目錄啟動TCP服務,類比第二個伺服器(冗餘運行),你能使用下面的命令:
· 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:~/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 |
使用SSL/TLS的伺服器模式(遠端連線) |
jdbc:h2:ssl://<server>[:<port>]/<databaseName> jdbc:h2:ssl://secureserv:8085/~/sample; |
使用加密檔案 |
jdbc:h2:<url>;CIPHER=[AES|XTEA] jdbc:h2:ssl://secureserv/~/testdb;CIPHER=AES jdbc:h2:file:~/secure;CIPHER=XTEA |
檔案鎖 |
jdbc:h2:<url>;FILE_LOCK={NO|FILE|SOCKET} jdbc:h2:file:~/quickAndDirty;FILE_LOCK=NO jdbc:h2:file:~/private;CIPHER=XTEA;FILE_LOCK=SOCKET |
僅開啟存在的資料庫 |
jdbc:h2:<url>;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE |
當虛擬機器退出時並不關閉資料庫 |
jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE |
使用者名稱和密碼 |
jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123 |
更新記入索引 |
jdbc:h2:<url>;LOG=2 jdbc:h2:file:~/sample;LOG=2 |
調試跟蹤項設定 |
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_LOG=rws;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 |
自動重串連 |
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>;<setting>=<value>[;<setting>=<value>...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 |