H2資料庫攻略

沒頭腦的土豆發表於2013-12-18

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

 

 

三、應用程式配置

1Properties配置

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 Profilemaven 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語法圖

1SELECT

2INSERT

3UPDATE

4DELETE

5BACKUP

6EXPLAIN

7MERGE

8RUNSCRIPT

執行sql指令碼檔案

9SCRIPT

根據資料庫建立sql指令碼

10SHOW

11ALTER INDEX RENAME

12ALTER SCHEMA RENAME

13ALTER SEQUENCE

14ALTER TABLE

增加列

增加約束

修改列

刪除列

刪除序列

15ALTER USER

修改使用者名稱

修改使用者密碼

16ALTER VIEW

17COMMENT

18CREATE CONSTANT

19CREATE INDEX

20CREATE ROLE

21CREATE SCHEMA

22CREATE SEQUENCE

23CREATE TABLE

24CREATE TRIGGER

25CREATE USER

26CREATE VIEW

27DROP

28GRANT RIGHT授權

schema授權

複製角色的許可權

29REVOKE RIGHT移除授權

移除角色具有的許可權

30ROLLBACK

從某個還原點(savepoint)回滾

回滾事務

建立savepoint

 

 

五、資料型別

H2支援如下資料型別

1INT 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服務

執行如下命令分別在91019102埠啟動兩個使用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)

相關文章