H2數(shù)據(jù)庫使用指南

H2是一個(gè)開源的嵌入式數(shù)據(jù)庫引擎,采用java語言編寫,不受平臺的限制,同時(shí)H2提供了一個(gè)十分方便的web控制臺用于操作和管理數(shù)據(jù)庫內(nèi)容。H2還提供兼容模式,可以兼容一些主流的數(shù)據(jù)庫,因此采用H2作為開發(fā)期的數(shù)據(jù)庫非常方便。

一、引入Maven依賴

在maven中定義H2數(shù)據(jù)庫的版本屬性

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

二、運(yùn)行方式

1、內(nèi)存模式

數(shù)據(jù)庫只在內(nèi)存中運(yùn)行,關(guān)閉連接后數(shù)據(jù)庫將被清空,適合測試環(huán)境
連接字符串:
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1
如果不指定DBName,則以私有方式啟動(dòng),只允許一個(gè)連接

2、嵌入式

數(shù)據(jù)庫持久化存儲為單個(gè)文件
連接字符串:
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
~/.h2/DBName表示數(shù)據(jù)庫文件的存儲位置,如果第一次連接則會自動(dòng)創(chuàng)建數(shù)據(jù)庫

3、服務(wù)模式

H2支持三種服務(wù)模式:

  • web server:此種運(yùn)行方式支持使用瀏覽器訪問H2 Console
  • TCP server:支持客戶端/服務(wù)器端的連接方式
  • PG server:支持PostgreSQL客戶端

啟動(dòng)tcp服務(wù)連接字符串示例:

jdbc:h2:tcp://localhost/~/test  使用用戶主目錄
jdbc:h2:tcp://localhost//data/test   使用絕對路徑

4、連接字符串參數(shù)

DB_CLOSE_DELAY:要求最后一個(gè)正在連接的連接斷開后,不要關(guān)閉數(shù)據(jù)庫
MODE=MySQL:兼容模式,H2兼容多種數(shù)據(jù)庫,該值可以為:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQL
AUTO_RECONNECT=TRUE:連接丟失后自動(dòng)重新連接
AUTO_SERVER=TRUE:啟動(dòng)自動(dòng)混合模式,允許開啟多個(gè)連接,該參數(shù)不支持在內(nèi)存中運(yùn)行模式
TRACE_LEVEL_SYSTEM_OUT、TRACE_LEVEL_FILE:輸出跟蹤日志到控制臺或文件, 取值0為OFF,1為ERROR(默認(rèn)值),2為INFO,3為DEBUG
SET TRACE_MAX_FILE_SIZE mb:設(shè)置跟蹤日志文件的大小,默認(rèn)為16M

5、啟動(dòng)服務(wù)模式,打開H2 Console web頁面

啟動(dòng)服務(wù),在命令行中執(zhí)行
java -cp h2*.jar org.h2.tools.Server

執(zhí)行如下命令,獲取選項(xiàng)列表及默認(rèn)值
java -cp h2*.jar org.h2.tools.Server -?

常見的選項(xiàng)如下:

  • -web:啟動(dòng)支持H2 Console的服務(wù)
  • -webPort <port>:服務(wù)啟動(dòng)端口,默認(rèn)為8082
  • -browser:啟動(dòng)H2 Console web管理頁面
  • -tcp:使用TCP server模式啟動(dòng)
  • -pg:使用PG server模式啟動(dòng)

此外,使用maven也可以啟動(dòng)H2服務(wù)

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

在命令行中執(zhí)行如下命令啟動(dòng)H2 Console
mvn exec:java

或者建立一個(gè)bat文件
@echo offcall mvn exec:javapause

此操作相當(dāng)于執(zhí)行了如下命令:
java -jar h2-1.3.168.jar -web -webPort 8090 -browser

三、應(yīng)用程序配置

1、Properties配置

java應(yīng)用程序關(guān)于數(shù)據(jù)庫的Properties配置文件示例如下:

#h2 database settingsjdbc.driver=org.h2.Driverjdbc.url=jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1jdbc.username=sajdbc.password=#connection pool settingsjdbc.pool.maxIdle=5jdbc.pool.maxActive=40

2、初始化數(shù)據(jù)庫

(1)、在Maven中初始化數(shù)據(jù)庫
可以創(chuàng)建一個(gè)Profile,專門用于初始化數(shù)據(jù)庫。在maven中可以通過maven-antrun-plugin執(zhí)行ant任務(wù),在ant任務(wù)中使用sql標(biāo)簽可以執(zhí)行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>

執(zhí)行如下命令調(diào)用該P(yáng)rofile,初始化數(shù)據(jù)庫
mvn antrun:run -Prefresh-db

(2)、在Spring中初始化數(shù)據(jù)庫
Spring Profile和maven profile一樣,也可以模擬不同的開發(fā)環(huán)境。在Spirng中可以通過jdbc:initialize-database初始化數(shù)據(jù)庫,配置示例如下

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

<!-- 初始化數(shù)據(jù)表結(jié)構(gòu) --> 
    <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

運(yùn)行sql腳本文件


9、SCRIPT

根據(jù)數(shù)據(jù)庫創(chuàng)建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授權(quán)


給schema授權(quán)



復(fù)制角色的權(quán)限


29、REVOKE RIGHT移除授權(quán)


移除角色具有的權(quán)限


30、ROLLBACK

從某個(gè)還原點(diǎn)(savepoint)回滾



回滾事務(wù)



創(chuàng)建savepoint

五、數(shù)據(jù)類型

H2支持如下數(shù)據(jù)類型



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
自動(dòng)增長值
值范圍:-9223372036854775808 - 9223372036854775807
7、DECIMAL Type

示例:DECIMAL(20, 2)
8、DOUBLE Type



9、REAL Type
浮點(diǎn)類型
10、TIME Type
時(shí)間類型,格式為:hh:mm:ss
11 、DATE Type
日期類型,格式為:yyyy-MM-dd
12、TIMESTAMP Type

時(shí)間戳類型,格式為:yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]
可映射為java對象:java.sql.Timestamp/java.util.Date
13、BINARY Type

存儲字節(jié)流,大數(shù)據(jù)建議使用BLOB類型存儲
示例:BINARY(1000)
14、OTHER Type
用于存儲序列化的java對象
15、VARCHAR Type

存儲字符串,大文本數(shù)據(jù)建議使用CLOB類型存儲
示例:VARCHAR(255)
16、VARCHAR_IGNORECASE Type
與VARCHAR類似,但是不區(qū)分大小寫
17、CHAR Type

存儲unicode字符串,與VARCHAR的區(qū)別是,尾部的空格不會被存儲
18、BLOB Type



存儲大容量二進(jìn)制流,最大存儲2G數(shù)據(jù)
映射java對象類型為:java.sql.Blob /java.io.InputStream
19、CLOB Type

用于存儲大容量的文本數(shù)據(jù)
映射java對象類型為:java.sql.Clob/java.io.Reader
20、UUID Type
存儲通用唯一識別碼,占用128bit
21、ARRAY Type
數(shù)組類型,使用一個(gè)值列表(1,2)或PreparedStatement.setObject(.., new Object[] {..})存儲值
映射java對象類型為:java.lang.Object[]
22、GEOMETRY Type
存儲空間幾何對象,一般存儲WKT格式的空間數(shù)據(jù)

六、集群

H2支持兩臺服務(wù)器運(yùn)行兩個(gè)數(shù)據(jù)庫成為集群,兩個(gè)數(shù)據(jù)庫互為備份,如果一個(gè)服務(wù)器失效,另一個(gè)服務(wù)器仍然可以工作。另外只有服務(wù)模式支持集群配置。
H2可以通過CreateCluster工具創(chuàng)建集群,示例步驟如下(在在一臺服務(wù)器上模擬兩個(gè)數(shù)據(jù)庫組成集群):

1、創(chuàng)建目錄

創(chuàng)建兩個(gè)服務(wù)器工作的目錄
# mkdir server1# mkdir server2

2、啟動(dòng)tcp服務(wù)

執(zhí)行如下命令分別在9101、9102端口啟動(dòng)兩個(gè)使用tcp服務(wù)模式的數(shù)據(jù)庫

java org.h2.tools.Server-tcp -tcpPort 9101-baseDir server1java org.h2.tools.Server-tcp -tcpPort 9102 -baseDir server2

3、使用CreateCluster工具創(chuàng)建集群

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

如果兩個(gè)數(shù)據(jù)庫不存在,該命令將會自動(dòng)創(chuàng)建數(shù)據(jù)庫。如果一個(gè)數(shù)據(jù)庫失效,可以先刪除壞的數(shù)據(jù)庫文件,重新啟動(dòng)數(shù)據(jù)庫,然后重新運(yùn)行CreateCluster工具

4、連接數(shù)據(jù)庫

現(xiàn)在可以使用如下連接字符串連接集群數(shù)據(jù)庫
jdbc:h2:tcp://localhost:9101,localhost:9102/~/test

5、監(jiān)控集群運(yùn)行狀態(tài)

可以使用如下命令查看配置的集群服務(wù)器是否都在運(yùn)行
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'

6、限制

  • H2的集群并不支持針對事務(wù)的負(fù)載均衡,所以很多操作會使兩個(gè)數(shù)據(jù)庫產(chǎn)生不一致的結(jié)果,執(zhí)行如下操作時(shí)請小心:

RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()

  • 自動(dòng)增長列和標(biāo)識列不支持集群,當(dāng)插入數(shù)據(jù)時(shí),序列值需要手動(dòng)創(chuàng)建
  • 不支持SET AUTOCOMMIT FALSE語句,如果需要設(shè)置成為不自動(dòng)提交,可以執(zhí)行方法Connection.setAutoCommit(false)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容