H2是一個開源的嵌入式數據庫引擎,采用java語言編寫,不受平台的限制,同時H2提供了一個十分方便的web控制台用於操作和管理數據庫內容。H2還提供兼容模式,可以兼容一些主流的數據庫,因此采用H2作為開發期的數據庫非常方便。
一、引入Maven依賴
在maven中定義H2數據庫的版本屬性
|
1
2
3
|
<
properties
>
<
h2.version
>1.3.172</
h2.version
>
</
properties
>
|
添加H2依賴
|
1
2
3
4
5
6
|
<
dependency
>
<
groupId
>com.h2database</
groupId
>
<
artifactId
>h2</
artifactId
>
<
version
>${h2.version}</
version
>
<
scope
>test</
scope
>
</
dependency
>
|
二、運行方式
1、在內存中運行
數據庫只在內存中運行,關閉連接后數據庫將被清空,適合測試環境
連接字符串:
|
1
|
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-
1
|
如果不指定DBName,則以私有方式啟動,只允許一個連接
2、嵌入式
數據庫持久化存儲為單個文件
連接字符串:
|
1
|
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
|
~/.h2/DBName表示數據庫文件的存儲位置,如果第一次連接則會自動創建數據庫
3、服務模式
H2支持三種服務模式:
- web server:此種運行方式支持使用瀏覽器訪問H2 Console
- TCP server:支持客戶端/服務器端的連接方式
- PG server:支持PostgreSQL客戶端
啟動tcp服務連接字符串示例:
|
1
2
|
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頁面
啟動服務,在命令行中執行
|
1
|
java -cp h2*.jar org.h2.tools.Server
|
執行如下命令,獲取選項列表及默認值
|
1
|
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服務
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<?
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文件
|
1
2
3
|
@echo
off
call mvn exec:java
pause
|
此操作相當於執行了如下命令:
|
1
|
java -jar h2-
1.3
.
168
.jar -web -webPort
8090
-browser
|
三、應用程序配置
1、Properties配置
java應用程序關於數據庫的Properties配置文件示例如下:
|
1
2
3
4
5
6
7
8
|
#h2 database settings
jdbc.driver=org.h2.Driver
jdbc.url=jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-
1
jdbc.username=sa
jdbc.password=
#connection pool settings
jdbc.pool.maxIdle=
5
jdbc.pool.maxActive=
40
|
2、初始化數據庫
(1)、在Maven中初始化數據庫
可以創建一個Profile,專門用於初始化數據庫。在maven中可以通過maven-antrun-plugin執行ant任務,在ant任務中使用sql標簽可以執行sql腳本文件,配置示例如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<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初始化數據庫,配置示例如下
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<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、創建目錄
創建兩個服務器工作的目錄
|
1
2
|
# mkdir server1
# mkdir server2
|
2、啟動tcp服務
執行如下命令分別在9101、9102端口啟動兩個使用tcp服務模式的數據庫
|
1
2
|
java org.h2.tools.Server-tcp -tcpPort
9101
-baseDir server1
java org.h2.tools.Server-tcp -tcpPort
9102
-baseDir server2
|
3、使用CreateCluster工具創建集群
|
1
2
3
4
5
|
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、連接數據庫
現在可以使用如下連接字符串連接集群數據庫
|
1
|
jdbc:h2:tcp:
//localhost:9101,localhost:9102/~/test
|
5、監控集群運行狀態
可以使用如下命令查看配置的集群服務器是否都在運行
|
1
|
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME=
'CLUSTER'
|
6、限制
H2的集群並不支持針對事務的負載均衡,所以很多操作會使兩個數據庫產生不一致的結果,執行如下操作時請小心:
|
1
|
RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()
|
自動增長列和標識列不支持集群,當插入數據時,序列值需要手動創建
不支持SET AUTOCOMMIT FALSE語句,如果需要設置成為不自動提交,可以執行方法Connection.setAutoCommit(false)
