Spring BootでH2DBを組み込みモード(永続化あり)で利用する

Spring BootでH2 Databaseを組み込みモードで使用する方法について。

環境

  • Spring Boot: 2.3.3
  • H2 Database Engine: 1.4.200

使い方

application.propertiesに設定値を書き込むことで使用できます。

application.propertiesの設定例

spring.datasource.url=jdbc:h2:./test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.sql-script-encoding=UTF-8
spring.h2.console.enabled=true
spring.datasource.initialization-mode=never
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql

設定値の解説

spring.datasource.url

URLの記載例は何パターンかあります。詳しくは参考ページ参照。
./testと指定すると、resourcesフォルダ直下にデータベースファイル(test.mv.db)が作成されます。

spring.datasource.driver-class-name

固定値org.h2.Driverを指定します。

spring.datasource.sql-script-encoding

H2DBは任意のエンコーディングを使用可能です。
今回はUTF-8を使用します。

spring.h2.console.enabled

trueに設定すると、web上でコンソールを開いてデータベースの中身を見ることができます。(デバッグ用)

spring.datasource.initialization-mode

以下の値を設定できます。

  • always:常にデータソースを初期化する
  • embedded:埋め込みデータソースのみを初期化
  • never:初期化しない

このプロパティでは起動するたびに初期化/初期化しないの実質2択しか設定できないので、以下の方法で初期データを投入しつつ他のレコードを永続化するようにしました。

  1. spring.datasource.initialization-mode=alwaysに設定し、一度アプリケーションを起動する。
  2. データベースファイル(上記の例ではtest.mv.db)が作成された事を確認したら、アプリケーションを停止する。
  3. spring.datasource.initialization-mode=neverに設定し、再度アプリケーションを起動する。

Spring Data JPAを使う場合は他のプロパティで対応できるようですが、JPAは使ったことがないので未確認です。

参考