H2是一個開源的嵌入式數據庫引擎,採用java語言編寫,不受平臺的限制,同時H2提供了一個十分方便的web控制檯用於操做和管理數據庫內容。H2還提供兼容模式,能夠兼容一些主流的數據庫,所以採用H2做爲開發期的數據庫很是方便。java
1、引入Maven依賴
在maven中定義H2數據庫的版本屬性web
1
2
3
|
<
properties
>
<
h2.version
>1.3.172</
h2.version
>
</
properties
>
|
添加H2依賴spring
1
2
3
4
5
6
|
<
dependency
>
<
groupId
>com.h2database</
groupId
>
<
artifactId
>h2</
artifactId
>
<
version
>${h2.version}</
version
>
<
scope
>test</
scope
>
</
dependency
>
|
2、運行方式
一、在內存中運行
數據庫只在內存中運行,關閉鏈接後數據庫將被清空,適合測試環境sql
鏈接字符串:數據庫
1
|
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-
1
|
若是不指定DBName,則以私有方式啓動,只容許一個鏈接apache
二、嵌入式
數據庫持久化存儲爲單個文件數組
鏈接字符串:瀏覽器
1
|
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
|
~/.h2/DBName表示數據庫文件的存儲位置,若是第一次鏈接則會自動建立數據庫服務器
三、服務模式
H2支持三種服務模式:app
啓動tcp服務鏈接字符串示例:
1
2
|
jdbc:h2:tcp:
//localhost/~/test 使用用戶主目錄
jdbc:h2:tcp:
//localhost//data/test 使用絕對路徑
|
四、鏈接字符串參數
五、啓動服務模式,打開H2 Console web頁面
啓動服務,在命令行中執行
1
|
java -cp h2*.jar org.h2.tools.Server
|
執行以下命令,獲取選項列表及默認值
1
|
java -cp h2*.jar org.h2.tools.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
|
3、應用程序配置
一、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
|
二、初始化數據庫
(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>
|
4、sql語法圖
一、SELECT
二、INSERT
三、UPDATE
四、DELETE
五、BACKUP
六、EXPLAIN
七、MERGE
八、RUNSCRIPT
運行sql腳本文件
九、SCRIPT
根據數據庫建立sql腳本
十、SHOW
十一、ALTER INDEX RENAME
十二、ALTER SCHEMA RENAME
1三、ALTER SEQUENCE
1四、ALTER TABLE
增長列
增長約束
修改列
刪除列
刪除序列
1五、ALTER USER
修改用戶名
修改用戶密碼
1六、ALTER VIEW
1七、COMMENT
1八、CREATE CONSTANT
1九、CREATE INDEX
20、CREATE ROLE
2一、CREATE SCHEMA
2二、CREATE SEQUENCE
2三、CREATE TABLE
2四、CREATE TRIGGER
2五、CREATE USER
2六、CREATE VIEW
2七、DROP
2八、GRANT RIGHT受權
給schema受權
複製角色的權限
2九、REVOKE RIGHT移除受權
移除角色具備的權限
30、ROLLBACK
從某個還原點(savepoint)回滾
回滾事務
建立savepoint
5、數據類型
H2支持以下數據類型
一、INT Type
值範圍:-2147483648 – 2147483647
二、BOOLEAN Type
可選值:TRUE和FALSE
三、TINYINT Type
值範圍:-128 -127
四、SMALLINT Type
值範圍: -32768 to 32767
五、BIGINT Type
值範圍:-9223372036854775808 – 9223372036854775807
六、IDENTITY Type
自動增加值
值範圍:-9223372036854775808 – 9223372036854775807
七、DECIMAL Type
示例:DECIMAL(20, 2)
八、DOUBLE Type
九、REAL Type
浮點類型
十、TIME Type
時間類型,格式爲:hh:mm:ss
11 、DATE Type
日期類型,格式爲:yyyy-MM-dd
十二、TIMESTAMP Type
時間戳類型,格式爲:yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]
可映射爲java對象:java.sql.Timestamp/java.util.Date
1三、BINARY Type
存儲字節流,大數據建議使用BLOB類型存儲
示例:BINARY(1000)
1四、OTHER Type
用於存儲序列化的java對象
1五、VARCHAR Type
存儲字符串,大文本數據建議使用CLOB類型存儲
示例:VARCHAR(255)
1六、VARCHAR_IGNORECASE Type
與VARCHAR相似,可是不區分大小寫
1七、CHAR Type
存儲unicode字符串,與VARCHAR的區別是,尾部的空格不會被存儲
1八、BLOB Type
存儲大容量二進制流,最大存儲2G數據
映射java對象類型爲:java.sql.Blob /java.io.InputStream
1九、CLOB Type
用於存儲大容量的文本數據
映射java對象類型爲:java.sql.Clob/java.io.Reader
20、UUID Type
存儲通用惟一識別碼,佔用128bit
2一、ARRAY Type
數組類型,使用一個值列表(1,2)或PreparedStatement.setObject(.., new Object[] {..})存儲值
映射java對象類型爲:java.lang.Object[]
2二、GEOMETRY Type
存儲空間幾何對象,通常存儲WKT格式的空間數據
6、集羣
H2支持兩臺服務器運行兩個數據庫成爲集羣,兩個數據庫互爲備份,若是一個服務器失效,另外一個服務器仍然能夠工做。另外只有服務模式支持集羣配置。
H2能夠經過CreateCluster工具建立集羣,示例步驟以下(在在一臺服務器上模擬兩個數據庫組成集羣):
一、建立目錄
建立兩個服務器工做的目錄
1
2
|
# mkdir server1
# mkdir server2
|
二、啓動tcp服務
執行以下命令分別在910一、9102端口啓動兩個使用tcp服務模式的數據庫
1
2
|
java org.h2.tools.Server-tcp -tcpPort
9101
-baseDir server1
java org.h2.tools.Server-tcp -tcpPort
9102
-baseDir server2
|
三、使用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工具
四、鏈接數據庫
如今可使用以下鏈接字符串鏈接集羣數據庫
1
|
jdbc:h2:tcp:
//localhost:9101,localhost:9102/~/test
|
五、監控集羣運行狀態
可使用以下命令查看配置的集羣服務器是否都在運行
1
|
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME=
'CLUSTER'
|
六、限制
H2的集羣並不支持針對事務的負載均衡,因此不少操做會使兩個數據庫產生不一致的結果,執行以下操做時請當心:
1
|
RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()
|
自動增加列和標識列不支持集羣,當插入數據時,序列值須要手動建立
不支持SET AUTOCOMMIT FALSE語句,若是須要設置成爲不自動提交,能夠執行方法Connection.setAutoCommit(false)