H2數據庫使用指南

H2是一個開源的嵌入式數據庫引擎,采用java語言編寫,不受平臺的限制,同時H2提供了一個十分方便的web控制臺用于操作和管理數據庫內容。H2還提供兼容模式,可以兼容一些主流的數據庫,因此采用H2作為開發期的數據庫非常方便。

一、引入Maven依賴

在maven中定義H2數據庫的版本屬性

<properties>
  <h2.version>1.3.172</h2.version>
</properties>

 
<!--添加H2依賴-->
<dependency> 
  <groupId>com.h2database</groupId> 
  <artifactId>h2</artifactId> 
  <version>${h2.version}</version> 
  <scope>test</scope> 
</dependency>

二、運行方式

1、內存模式

數據庫只在內存中運行,關閉連接后數據庫將被清空,適合測試環境
連接字符串:
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1
如果不指定DBName,則以私有方式啟動,只允許一個連接

2、嵌入式

數據庫持久化存儲為單個文件
連接字符串:
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
~/.h2/DBName表示數據庫文件的存儲位置,如果第一次連接則會自動創建數據庫

3、服務模式

H2支持三種服務模式:

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

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

jdbc:h2:tcp://localhost/~/test  使用用戶主目錄
jdbc:h2:tcp://localhost//data/test   使用絕對路徑

4、連接字符串參數

DB_CLOSE_DELAY:要求最后一個正在連接的連接斷開后,不要關閉數據庫
MODE=MySQL:兼容模式,H2兼容多種數據庫,該值可以為:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQL
AUTO_RECONNECT=TRUE:連接丟失后自動重新連接
AUTO_SERVER=TRUE:啟動自動混合模式,允許開啟多個連接,該參數不支持在內存中運行模式
TRACE_LEVEL_SYSTEM_OUT、TRACE_LEVEL_FILE:輸出跟蹤日志到控制臺或文件, 取值0為OFF,1為ERROR(默認值),2為INFO,3為DEBUG
SET TRACE_MAX_FILE_SIZE mb:設置跟蹤日志文件的大小,默認為16M

5、啟動服務模式,打開H2 Console web頁面

啟動服務,在命令行中執行
java -cp h2*.jar org.h2.tools.Server

執行如下命令,獲取選項列表及默認值
java -cp h2*.jar org.h2.tools.Server -?

常見的選項如下:

  • -web:啟動支持H2 Console的服務
  • -webPort <port>:服務啟動端口,默認為8082
  • -browser:啟動H2 Console web管理頁面
  • -tcp:使用TCP server模式啟動
  • -pg:使用PG server模式啟動

此外,使用maven也可以啟動H2服務

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
  <modelVersion>1.0.0</modelVersion> 
  <version>1.0.0</version> 
  <groupId>groupid</groupId> 
  <artifactId>h2-console</artifactId> 
  <name>H2 Console</name> 
  <packaging>pom</packaging> 
  <properties> 
    <h2.version>1.3.172</h2.version> 
  </properties> 
  <dependencies> 
    <dependency> 
    <groupId>com.h2database</groupId> 
    <artifactId>h2</artifactId> 
    <version>${h2.version}</version> 
    <scope>runtime</scope> 
    </dependency> 
  </dependencies> 
  <build> 
      <plugins> 
          <plugin> 
            <groupId>org.codehaus.mojo</groupId> 
            <artifactId>exec-maven-plugin</artifactId> 
            <executions> 
                <execution> 
                    <goals> 
                        <goal>java</goal> 
                    </goals> 
                </execution> 
            </executions> 
            <configuration> 
                <mainClass>org.h2.tools.Server</mainClass> 
                <arguments>  
                    <argument>-web</argument> 
                    <argument>-webPort</argument>
                    <argument>8090</argument> 
                    <argument>-browser</argument> 
                    </arguments> 
            </configuration> 
        </plugin> 
    </plugins> 
  </build> 
</project>

在命令行中執行如下命令啟動H2 Console
mvn exec:java

或者建立一個bat文件
@echo offcall mvn exec:javapause

此操作相當于執行了如下命令:
java -jar h2-1.3.168.jar -web -webPort 8090 -browser

三、應用程序配置

1、Properties配置

java應用程序關于數據庫的Properties配置文件示例如下:

#h2 database settingsjdbc.driver=org.h2.Driverjdbc.url=jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1jdbc.username=sajdbc.password=#connection pool settingsjdbc.pool.maxIdle=5jdbc.pool.maxActive=40

2、初始化數據庫

(1)、在Maven中初始化數據庫
可以創建一個Profile,專門用于初始化數據庫。在maven中可以通過maven-antrun-plugin執行ant任務,在ant任務中使用sql標簽可以執行sql腳本文件,配置示例如下:

<profile> 
    <id>refresh-db</id> 
    <build> 
        <plugins> 
            <plugin> 
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-antrun-plugin</artifactId> 
               <configuration> 
               <target> 
                   <property file="src/main/resources/application.properties" /> 
                   <sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}" onerror="continue" encoding="${project.build.sourceEncoding}">
                       <classpath refid="maven.test.classpath" /> 
                       <transaction src="src/main/resources/sql/h2/schema.sql"/>
                       <transaction src="src/test/resources/data/h2/import-data.sql"/>
                   </sql> 
              </target> 
              </configuration> 
            </plugin> 
        </plugins> 
    </build> 
</profile>

執行如下命令調用該Profile,初始化數據庫
mvn antrun:run -Prefresh-db

(2)、在Spring中初始化數據庫
Spring Profile和maven profile一樣,也可以模擬不同的開發環境。在Spirng中可以通過jdbc:initialize-database初始化數據庫,配置示例如下

<beans profile="test"> 
    <context:property-placeholder ignore-resource-not-found="true" location="classpath*:/application.properties, classpath*:/application.test.properties" /> 

<!-- Spring Simple連接池 --> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${jdbc.driver}" /> 
        <property name="url" value="${jdbc.url}" /> 
        <property name="username" value="${jdbc.username}" /> 
        <property name="password" value="${jdbc.password}" /> 
    </bean> 

<!-- 初始化數據表結構 --> 
    <jdbc:initialize-database data-source="dataSource" ignore-failures="ALL"> 
        <jdbc:script location="classpath:sql/h2/schema.sql" /> 
        <jdbc:script location="classpath:data/h2/import-data.sql" encoding="UTF-8"/> 
    </jdbc:initialize-database> 
</beans>

四、sql語法圖

1、SELECT

2、INSERT

3、UPDATE

4、DELETE

5、BACKUP

6、EXPLAIN

7、MERGE

8、RUNSCRIPT

運行sql腳本文件


9、SCRIPT

根據數據庫創建sql腳本


10、SHOW

11、ALTER INDEX RENAME

12、ALTER SCHEMA RENAME

13、ALTER SEQUENCE

14、ALTER TABLE

增加列



增加約束



修改列

刪除列



刪除序列

15、ALTER USER

修改用戶名



修改用戶密碼


16、ALTER VIEW

17、COMMENT

18、CREATE CONSTANT

19、CREATE INDEX

20、CREATE ROLE

21、CREATE SCHEMA

22、CREATE SEQUENCE

23、CREATE TABLE

24、CREATE TRIGGER

25、CREATE USER

26、CREATE VIEW

27、DROP

28、GRANT RIGHT授權


給schema授權



復制角色的權限


29、REVOKE RIGHT移除授權


移除角色具有的權限


30、ROLLBACK

從某個還原點(savepoint)回滾



回滾事務



創建savepoint

五、數據類型

H2支持如下數據類型



1、INT Type



值范圍:-2147483648 - 2147483647
2、BOOLEAN Type

可選值:TRUE和FALSE
3、TINYINT Type
值范圍:-128 -127
4、SMALLINT Type



值范圍: -32768 to 32767
5、BIGINT Type

值范圍:-9223372036854775808 - 9223372036854775807
6、IDENTITY Type
自動增長值
值范圍:-9223372036854775808 - 9223372036854775807
7、DECIMAL Type

示例:DECIMAL(20, 2)
8、DOUBLE Type



9、REAL Type
浮點類型
10、TIME Type
時間類型,格式為:hh:mm:ss
11 、DATE Type
日期類型,格式為:yyyy-MM-dd
12、TIMESTAMP Type

時間戳類型,格式為:yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]
可映射為java對象:java.sql.Timestamp/java.util.Date
13、BINARY Type

存儲字節流,大數據建議使用BLOB類型存儲
示例:BINARY(1000)
14、OTHER Type
用于存儲序列化的java對象
15、VARCHAR Type

存儲字符串,大文本數據建議使用CLOB類型存儲
示例:VARCHAR(255)
16、VARCHAR_IGNORECASE Type
與VARCHAR類似,但是不區分大小寫
17、CHAR Type

存儲unicode字符串,與VARCHAR的區別是,尾部的空格不會被存儲
18、BLOB Type



存儲大容量二進制流,最大存儲2G數據
映射java對象類型為:java.sql.Blob /java.io.InputStream
19、CLOB Type

用于存儲大容量的文本數據
映射java對象類型為:java.sql.Clob/java.io.Reader
20、UUID Type
存儲通用唯一識別碼,占用128bit
21、ARRAY Type
數組類型,使用一個值列表(1,2)或PreparedStatement.setObject(.., new Object[] {..})存儲值
映射java對象類型為:java.lang.Object[]
22、GEOMETRY Type
存儲空間幾何對象,一般存儲WKT格式的空間數據

六、集群

H2支持兩臺服務器運行兩個數據庫成為集群,兩個數據庫互為備份,如果一個服務器失效,另一個服務器仍然可以工作。另外只有服務模式支持集群配置。
H2可以通過CreateCluster工具創建集群,示例步驟如下(在在一臺服務器上模擬兩個數據庫組成集群):

1、創建目錄

創建兩個服務器工作的目錄
# mkdir server1# mkdir server2

2、啟動tcp服務

執行如下命令分別在9101、9102端口啟動兩個使用tcp服務模式的數據庫

java org.h2.tools.Server-tcp -tcpPort 9101-baseDir server1java org.h2.tools.Server-tcp -tcpPort 9102 -baseDir server2

3、使用CreateCluster工具創建集群

java org.h2.tools.CreateCluster -urlSource jdbc:h2:tcp://localhost:9101/~/test -urlTarget jdbc:h2:tcp://localhost:9102/~/test -user sa -serverList localhost:9101,localhost:9102

如果兩個數據庫不存在,該命令將會自動創建數據庫。如果一個數據庫失效,可以先刪除壞的數據庫文件,重新啟動數據庫,然后重新運行CreateCluster工具

4、連接數據庫

現在可以使用如下連接字符串連接集群數據庫
jdbc:h2:tcp://localhost:9101,localhost:9102/~/test

5、監控集群運行狀態

可以使用如下命令查看配置的集群服務器是否都在運行
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'

6、限制

  • H2的集群并不支持針對事務的負載均衡,所以很多操作會使兩個數據庫產生不一致的結果,執行如下操作時請小心:

RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()

  • 自動增長列和標識列不支持集群,當插入數據時,序列值需要手動創建
  • 不支持SET AUTOCOMMIT FALSE語句,如果需要設置成為不自動提交,可以執行方法Connection.setAutoCommit(false)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容