H2數據庫攻略
來自: http://www.importnew.com/17924.html
H2是一個開源的嵌入式數據庫引擎,采用java語言編寫,不受平臺的限制,同時H2提供了一個十分方便的web控制臺用于操作和管理數據庫內容。H2還提供兼容模式,可以兼容一些主流的數據庫,因此采用H2作為開發期的數據庫非常方便。
一、引入Maven依賴
在maven中定義H2數據庫的版本屬性
</div>
<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>
二、運行方式
</div>
1、在內存中運行
數據庫只在內存中運行,關閉連接后數據庫將被清空,適合測試環境
</div>
連接字符串:
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1
如果不指定DBName,則以私有方式啟動,只允許一個連接
2、嵌入式
數據庫持久化存儲為單個文件
</div>
連接字符串:
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
~/.h2/DBName表示數據庫文件的存儲位置,如果第一次連接則會自動創建數據庫
3、服務模式
H2支持三種服務模式:
</div>
- 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 ; <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></pre>
在命令行中執行如下命令啟動H2 Console
mvn exec:java
或者建立一個bat文件
<pre>@echo off call mvn exec:java pause</pre>
此操作相當于執行了如下命令:
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</pre>
2、初始化數據庫
</div>
(1)、在Maven中初始化數據庫
</div>
可以創建一個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></pre>
四、sql語法圖
1、SELECT
</div>
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支持兩臺服務器運行兩個數據庫成為集群,兩個數據庫互為備份,如果一個服務器失效,另一個服務器仍然可以工作。另外只有服務模式支持集群配置。
</div>
H2可以通過CreateCluster工具創建集群,示例步驟如下(在在一臺服務器上模擬兩個數據庫組成集群):
1、創建目錄
創建兩個服務器工作的目錄
</div>
# mkdir server1mkdir server2</pre>
2、啟動tcp服務
執行如下命令分別在9101、9102端口啟動兩個使用tcp服務模式的數據庫
</div>
java org.h2.tools.Server-tcp -tcpPort 9101-baseDir server1 java org.h2.tools.Server-tcp -tcpPort 9102 -baseDir server23、使用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、連接數據庫
現在可以使用如下連接字符串連接集群數據庫
</div>
jdbc:h2:tcp://localhost:9101,localhost:9102/~/test5、監控集群運行狀態
</div>
可以使用如下命令查看配置的集群服務器是否都在運行
</div>
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'6、限制
</div>
H2的集群并不支持針對事務的負載均衡,所以很多操作會使兩個數據庫產生不一致的結果,執行如下操作時請小心:
</div>
RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()自動增長列和標識列不支持集群,當插入數據時,序列值需要手動創建
不支持SET AUTOCOMMIT FALSE語句,如果需要設置成為不自動提交,可以執行方法Connection.setAutoCommit(false)
</div>本文由用戶 dviy0109 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關資訊
sesese色