H2數據庫使用

H2最完整的資料下載地址

http://download.csdn.net/detail/yixiaoping/5956595




H2數據庫使用


H2數據庫介紹

常用的開源數據庫:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2,HSQLDB類似,十分適合作爲嵌入式數據庫使用,其它的數據庫大部分都需要安裝獨立的客戶端和服務器端。
H2的優勢:
1、h2採用純Java編寫,因此不受平臺的限制。
2、h2只有一個jar文件,十分適合作爲嵌入式數據庫試用。
3、性能和功能的優勢

H2比HSQLDB的最大的優勢就是h2提供了一個十分方便的web控制檯用於操作和管理數據庫內容,這點比起HSQLDB的swing和awt控制檯實在好用多了。

H2和各數據庫特徵比較。

準備工作

 
1、h2-2011-04-04.zip  下載地址:http://www.h2database.com/html/download.html
2、解壓文件,這裏以%H2_HOME%表示爲解壓的文件目錄。運行%H2_HOME%\bin\h2.bat 將會自動打開下面網址。(請確認是否安裝了jdk,並設置了JAVA_HOME環境變量)
http://192.168.140.1: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

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