【轉】H2數據庫攻略

http://www.cnblogs.com/gao241/p/3480472.html

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 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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章