先簡單介紹一下H2資料庫:
H2是一個開源的輕量級Java資料庫。它可以嵌入Java應用程式中,也可以在客戶端 - 伺服器模式下執行。主要是,H2資料庫可以配置為在記憶體資料庫中執行,這意味著資料不會在磁碟上持久存在。由於嵌入式資料庫,它不用於生產開發,但主要用於開發和測試.
此資料庫可用於嵌入模式或伺服器模式.以下是H2資料庫的主要功能 :
非常快,開源,JDBC API可在嵌入式和伺服器模式下使用;記憶體資料庫基於瀏覽器的控制檯應用程式非常小,大約1.5MB jar檔案大小支援標準的SQL和JDBC支援事務由此,我們可以開發環境下使用H2,在生產環境中使用其他我們選擇的資料:Mysql 、Oracle等。
本案例中開發環境使用H2,測試、生產環境都使用MySql,資料庫連線池我們使用SpringBoot預設的HikariDataSource。
首先,引入Jar包:
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency>
然後配置檔案中如下配置:
spring: datasource: # 連線字串 下面會有詳細解釋 url: jdbc:h2:mem:~/xtoad_base_db;mode=mysql;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1 # 連線資料庫的使用者名稱 username: sa # 連線資料庫的密碼 password: sa # 初始化模式,其中有三個值,always為始終執行初始化,embedded只初始化記憶體資料庫(預設值),如h2等,never為不執行初始化 initialization-mode: always # 初始化表結構的sql,本例中結合JPA 故可以不設定 #schema: classpath:static/schema.sql # 啟動時載入資料的SQL,裡面是insert 語句 data: classpath:static/data.sql # 連線池型別 type: com.zaxxer.hikari.HikariDataSource hikari: pool-name: XtoadHikariPool minimum-idle: 5 maximum-pool-size: 15 auto-commit: true idle-timeout: 30000 max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1 # h2配置 h2: console: # 啟用web管理介面 enabled: true # Web管理介面的url 假如你的應用地址是: http://localhost:9001 則H2管理介面為: http://localhost:9001/h2 path: /h2 settings: # 啟用遠端訪問 web-allow-others: true trace: true # Jpa配置 jpa: # 資料庫選擇 database: h2 # 在控制檯列印Sql show-sql: true # 避免懶載入時報錯 open-in-view: true # 生成ddl語句 generate-ddl: true
H2資料庫連線字串引數解釋如下:
DB_CLOSE_DELAY:要求最後一個正在連線的連線斷開後,不要關閉資料庫。MODE=MySQL:相容模式,H2相容多種資料庫,該值可以為:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQLAUTO_RECONNECT=TRUE:連線丟失後自動重新連線AUTO_SERVER=TRUE:啟動自動混合模式,允許開啟多個連線,該引數不支援在記憶體中執行模式TRACE_LEVEL_SYSTEM_OUT、TRACE_LEVEL_FILE:輸出跟蹤日誌到控制檯或檔案, 取值0為OFF,1為ERROR(預設值),2為INFO,3為DEBUGSET TRACE_MAX_FILE_SIZE mb:設定跟蹤日誌檔案的大小,預設為16MH2資料庫連線方式URL說明:
嵌入式(本地)資料庫 |
jdbc:h2:[file:][<path>]<databaseName> | |
eg. jdbc:h2:~/test_db | ||
eg. jdbc:h2:file:/data/db | ||
eg. jdbc:h2:file:C:/data/db |
(windows only) | |
記憶體資料庫(私有) |
jdbc:h2:mem: | |
記憶體資料庫(被命名) |
jdbc:h2:mem:<databaseName> | |
eg. jdbc:h2:mem:test_db | ||
使用TCP/IP的遠端連線 |
jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> | |
eg. jdbc:h2:tcp://localhost/~/test_db | ||
eg. jdbc:h2:tcp://dbserver:3450/~/test_db |
詳細解釋如下:
jdbc:h2:file:E:/data/H2 表示將初始化的資料和H2 Console控制檯執行的資料儲存到E盤下data/H2資料夾中,即使應用重啟,資料不會丟失。jdbc:h2:~/testdatabase 這裡就需要說明一下”~”這個符號在window作業系統下代表什麼意思了,在Window作業系統下,”~”這個符號代表的就是當前登入到作業系統的使用者對應的使用者目錄,所以testdatabase資料庫對應的檔案存放在登入到作業系統的使用者對應的使用者目錄當中,比如我當前是使用Administrator使用者登入作業系統的,所以在”C:\Documents and Settings\Administrator.h2”目錄中就可以找到test資料庫對應的資料庫檔案了。持久化本地的問題:由於本地已經存在表,而應用每次啟動都會建立表,導致下次啟動時會啟動報錯。除非手動注掉application.properties中新建表的配置,或則刪除本地對應目錄的檔案。
jdbc:h2:mem:soa_service_api、jdbc:h2:mem:~/.h2/url 類似於這種配置的,表示將初始化和h2 console控制檯上操作的資料儲存在記憶體(mem-memory)儲存到記憶體的問題:由於每次重啟應用記憶體釋放掉後,對應的資料也會消失,當然初始化的表+初始化資料就都沒了。然後重啟會從data.sql中重新初始化資料,啟動正常。但是你透過h2console操作的其他資料則全部丟失。解決辦法是把在h2 console新新增的介面地址配置到data.sql中。然後重新啟動才行。
以上為配置部分講解完畢,我們在工程中可以很方便地使用h2做開發和自測,快速方便。
下面我們啟動工程,輸入url 訪問資料:
登入進入後,可以看到我們的表都已經建立了,並且data.sql 指令碼中初始化的資料都已經插入到資料庫中:
本節原始碼地址:https://gitee.com/xtoad/ecms-java.git