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 off
call mvn exec:java
pause
此操作相當於執行了如下命令:
java -jar h2-1.3.168.jar -web -webPort 8090 -browser
三、應用程式配置
1、Properties配置
java應用程式關於資料庫的Properties配置檔案示例如下:
#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指令碼檔案,配置示例如下:
<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 server1
java 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)