H2數據庫入門,看這篇就對了

H2數據庫是一個開源的關係型數據庫。

H2是一個採用java語言編寫的嵌入式數據庫引擎,只是一個類庫(即只有一個 jar 文件),可以直接嵌入到應用項目中,不受平臺的限制

應用場景:

  • 可以同應用程序打包在一起發佈,可以非常方便地存儲少量結構化數據
  • 可用於單元測試
  • 可以用作緩存,即當做內存數據庫

H2的產品優勢:

  • 純Java編寫,不受平臺的限制;
  • 只有一個jar文件,適合作爲嵌入式數據庫使用;
  • h2提供了一個十分方便的web控制檯用於操作和管理數據庫內容;
  • 功能完整,支持標準SQL和JDBC。麻雀雖小五臟俱全;
  • 支持內嵌模式、服務器模式和集羣。

安裝

在這裏插入圖片描述

建議下載 All Platforms 的,Linux版本的也在裏面。

解壓後目錄如下:

h2/
|--bin/
|  |--h2-1.4.200.jar
|  |--h2.bat
|  |--h2.sh
|  |--h2w.bat
|--docs/
|--service/
|--src/
|--build.bat
|--build.sh

目錄說明:

h2-1.4.200.jar   H2數據庫的jar包

h2.bat           Windows控制檯啓動腳本

h2.sh            Linux控制檯啓動腳本

h2w.bat          Windows控制檯啓動腳本 

build.bat        windows構建腳本

build.sh         linux構建腳本

docs             H2數據庫的幫助文檔(內有H2數據庫的使用手冊)

service          通過wrapper包裝成服務。

src              H2數據庫的源代碼

啓動

win10下啓動:

進入H2 的bin目錄,運行 h2.bat 或 h2w.bat(區別爲h2w.bat是後臺靜默運行)

系統會進入H2 數據庫的Web Console,http://<你的ip>:8082

在這裏插入圖片描述

jdbc:h2:D:/software/h2/data/test,會在指定路徑下創建一個名爲 test.mv.db 的數據庫,你可能還會看到一個 test.trace.db 的文件,這個是h2的錯誤信息,可以直接打開看。有沒有跟我一樣好奇爲啥名稱裏面有個mv,這是因爲高版本的H2存儲引擎默默認爲mvStore,文檔最後面有講這個存儲引擎的。

點擊Connect,進入管理終端

在這裏插入圖片描述

運行模式與運行方式

運行模式

H2有三種運行模式。

  1. 內嵌模式(Embedded Mode):內嵌模式下,應用和數據庫同在一個JVM中,通過JDBC進行連接。可持久化,但同時只能一個客戶端連接。內嵌模式性能會比較好。
  2. 服務器模式(Server Mode):使用服務器模式和內嵌模式一樣,只不過它可以跑在另一個進程裏。
  3. 混合模式:
    第一個應用以內嵌模式啓動它,對於後面的應用來說它是服務器模式跑着的。混合模式是內嵌模式和服務器模式的組合。第一個應用通過內嵌模式與數據庫建立連接,同時也作爲一個服務器啓動,於是另外的應用(運行在不同的進程或是虛擬機上)可以同時訪問同樣的數據。第一個應用的本地連接與嵌入式模式的連接性能一樣的快,而其它連接理論上會略慢。

連接方式

  1. 以嵌入式(本地)連接方式連接H2數據庫

    這種連接方式默認情況下只允許有一個客戶端連接到H2數據庫,有客戶端連接到H2數據庫之後,此時數據庫文件就會被鎖定,那麼其他客戶端就無法再連接了。

    連接語法:jdbc:h2:[file:][<path>]<databaseName>

    例如:

    • jdbc:h2:~/test    // 連接位於用戶目錄下的test數據庫
    • jdbc:h2:file:/data/sample
    • jdbc:h2:file:E:/H2/gacl // Windows only
  2. 使用TCP/IP的服務器模式(遠程連接)方式連接H2數據庫(推薦)

    這種連接方式就和其他數據庫類似了,是基於Service的形式進行連接的,因此允許多個客戶端同時連接到H2數據庫。

    連接語法:jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>

    範例:jdbc:h2:tcp://localhost/~/test

  3. H2數據庫的內存模式

    連接語法:jdbc:h2:mem:<databaseName>

    • H2數據庫被稱爲內存數據庫,因爲它支持在內存中創建數據庫和表。
    • 注意:如果使用H2數據庫的內存模式,那麼我們創建的數據庫和表都只是保存在內存中,一旦服務器重啓,那麼內存中的數據庫和表就不存在了。

可選配置

在用戶目錄下新建 .h2.server.properties,支持如下屬性配置:

  • webAllowOthers: 是否允許遠程連接,默認 false。
  • webPort: h2 端口,默認爲 8082。
  • webSSL: 是否啓用 SSL 加密連接,默認 false。
  • webAdminPassword: 超級管理員密碼。

超級管理員密碼進入如下頁面需要:

在這裏插入圖片描述

如果沒有手動配置此文件,以 web-server 方式首次啓動 H2 後,點擊打開的瀏覽器頁面的 Save 按鈕後就會自動創建一個。

.h2.server.properties 文件範例:

#H2 Server Properties
#Wed Jul 01 23:00:28 CST 2020
0=Generic JNDI Data Source|javax.naming.InitialContext|java\:comp/env/jdbc/Test|sa
1=Generic Teradata|com.teradata.jdbc.TeraDriver|jdbc\:teradata\://whomooz/|
10=Generic DB2|com.ibm.db2.jcc.DB2Driver|jdbc\:db2\://localhost/test|
11=Generic Oracle|oracle.jdbc.driver.OracleDriver|jdbc\:oracle\:thin\:@localhost\:1521\:XE|sa
12=Generic MS SQL Server 2000|com.microsoft.jdbc.sqlserver.SQLServerDriver|jdbc\:microsoft\:sqlserver\://localhost\:1433;DatabaseName\=sqlexpress|sa
13=Generic MS SQL Server 2005|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc\:sqlserver\://localhost;DatabaseName\=test|sa
14=Generic PostgreSQL|org.postgresql.Driver|jdbc\:postgresql\:test|
15=Generic MySQL|com.mysql.jdbc.Driver|jdbc\:mysql\://localhost\:3306/test|
16=Generic HSQLDB|org.hsqldb.jdbcDriver|jdbc\:hsqldb\:test;hsqldb.default_table_type\=cached|sa
17=Generic Derby (Server)|org.apache.derby.jdbc.ClientDriver|jdbc\:derby\://localhost\:1527/test;create\=true|sa
18=Generic Derby (Embedded)|org.apache.derby.jdbc.EmbeddedDriver|jdbc\:derby\:test;create\=true|sa
19=Generic H2 (Server)|org.h2.Driver|jdbc\:h2\:tcp\://localhost/~/test|sa
2=Generic Snowflake|com.snowflake.client.jdbc.SnowflakeDriver|jdbc\:snowflake\://accountName.snowflakecomputing.com|
20=Generic H2 (Embedded)|org.h2.Driver|jdbc\:h2\:~/test|root
3=Generic Redshift|com.amazon.redshift.jdbc42.Driver|jdbc\:redshift\://endpoint\:5439/database|
4=Generic Impala|org.cloudera.impala.jdbc41.Driver|jdbc\:impala\://clustername\:21050/default|
5=Generic Hive 2|org.apache.hive.jdbc.HiveDriver|jdbc\:hive2\://clustername\:10000/default|
6=Generic Hive|org.apache.hadoop.hive.jdbc.HiveDriver|jdbc\:hive\://clustername\:10000/default|
7=Generic Azure SQL|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc\:sqlserver\://name.database.windows.net\:1433|
8=Generic Firebird Server|org.firebirdsql.jdbc.FBDriver|jdbc\:firebirdsql\:localhost\:c\:/temp/firebird/test|sysdba
9=Generic SQLite|org.sqlite.JDBC|jdbc\:sqlite\:test|sa
webAllowOthers=false
webPort=8082
webSSL=false
webAdminPassword=111111

注:在 H2 Control 每次構建的數據庫連接保存後都會作爲歷史配置項自動保存到 .h2.server.properties 文件內,一行一個鏈接配置,格式爲 <number>=<name>|<driver>|<url>|<user>
上述編號 0~20 的連接配置是 H2 默認提供的,編號 21 是我自行創建保存的,連接的密碼因安全性不會保存下來。

spring boot2.x中集成H2數據庫

添加依賴:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

配置如下:

spring.jpa.database=h2
spring.jpa.show-sql=true
# ddl執行方式,update create 等
spring.jpa.hibernate.ddl-auto=update


spring.datasource.platform=h2  #表明使用的數據庫平臺是h2
spring.datasource.url=jdbc:h2:./data/test;AUTO_SERVER=TRUE
spring.datasource.username=sa
spring.datasource.password=123456
spring.datasource.driverClassName=org.h2.Driver

# 進行該配置後,h2 web consloe就可以在遠程訪問了。否則只能在本機訪問。
spring.h2.console.settings.web-allow-others=true  
# 進行該配置,你就可以通過YOUR_URL/h2訪問h2 web consloe。YOUR_URL是你程序的訪問URl。
spring.h2.console.path=/h2-consloe
# 進行該配置,程序開啓時就會啓動h2 web consloe。當然這是默認的,如果你不想在啓動程序時啓動h2 web consloe,那麼就設置爲false。
spring.h2.console.enabled=true  

FilePath的格式說明:

  • ./{path}/{fileName} 在當前程序的根目錄下創建目錄和數據庫文件

  • ~/{path}/{fileName} 在當前用戶的根目錄下創建目錄和數據庫文件(windows即用戶目錄,Linux即home目錄)

  • C:/{path}/{fileName} 在指定盤符的指定目錄下創建數據庫文件

附加參數:

  • AUTO_SERVER=TRUE 啓動自動混合模式,允許開啓多個連接,該參數不支持在內存中運行模式

  • DB_CLOSE_ON_EXIT=FALSE,當虛擬機退出時並不關閉數據庫

  • MODE=MYSQL 兼容MySQL

更多URL格式和示例可以看這篇博客最下面:H2數據庫使用簡介

使用和MySQL沒啥區別,MyBatis,Hibernate以前怎麼用,現在還怎麼用,主要就是配置。

錯誤信息查看

上面已經提到過,類似 test.trace.db 這樣的文件,就是H2的錯誤信息,我們打開看看:

在這裏插入圖片描述

我們主要去找 [*] 這個符號和後面的錯誤碼,然後對照着官方的錯誤碼說明看,就知道哪裏報錯了。

我們看看[42001-200]這個錯誤碼,前面的 42001 是錯誤碼,後面的 200 的 h2 的版本

在這裏插入圖片描述

大概意思就是:嘗試執行無效的SQL語句時引發代碼42001的錯誤,原因就是 H2 不支持
MySQLENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 這些設置,創建表的時候去掉就好了。

其他

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