(第8回) H2のデータ保存先をファイルに設定、データの永続化【Spring Boot2】

H2入門の第8回です。H2データベースのデータ保存をファイルにする設定について説明します。H2をファイルベースで利用する事でデータを永続化できます。Spring Bootの初心者・入門者の方は、参考にしてみてください。

環境と今回の目的

最終更新日:2021/4/19

H2はインストール作業など必要なく、Spring Bootアプリで使えるデータベースです。その手軽さがメリットです。
また、H2のデータ保存先は、インメモリとファイルのどちらでもできます。

今まではH2をインメモリベースで使ってきました。インメモリは起動し直すたびにデータが初期化されます。初期化されても特に問題ない開発途中のアプリなら、インメモリベースでH2を使う方が手軽でいいでしょう。

ただデータを永続化(起動し直しても以前のデータが使える)して使いたいケースもあります。データを永続化したい場合は、H2をファイルベースで扱えばできます。という事で今回は、H2をファイルベースで使うための設定を説明します。

・開発環境やバージョンは以下の通りです。
OS:macOS Catalina(バージョン10.15.5)
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)、(*2020/8/28時点の最新安定版です)
Spring Boot:バージョン2.3.3
Java:11
データベース:H2

H2をファイルベースで使うための設定

まず、application.propertiesファイルを編集します。

spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
#データをファイル保存
spring.datasource.url=jdbc:log4jdbc:h2:file:./hogefiledb
#Spring Data JPAの機能を無効化して、データベースの初期化処理はschema.sqlとdata.sqlで行う
spring.jpa.hibernate.ddl-auto=none
#以下は、SQLログの設定
logging.level.jdbc.sqlonly=info
logging.level.jdbc.resultsettable=info
logging.level.jdbc.connection=off
logging.level.jdbc.sqltiming=off
logging.level.jdbc.audit=off
logging.level.jdbc.resultset=off

コメントでも書いていますが、データをファイル保存するための設定はこの1行です。

spring.datasource.url=jdbc:log4jdbc:h2:file:./hogefiledb
この1行の"file"の部分でファイル保存になります(*データをインメモリにしたいなら"mem"にします)。

また、保存先のファイルパスは”./hogefiledb”にしています。この場合、Spring Bootアプリのロケーションディレクトリ直下に"hogefiledb.mv.db"というファイルを作成し、このファイルにデータ保存します。
(*Spring Bootアプリのロケーションディレクトリは、プロジェクトを右クリック->プロパティで確認できます)

そして、Spring Data JPAの機能を無効化して、データベースのテーブルとデータの初期化処理をschema.sqlとdata.sqlで行う設定です。

spring.jpa.hibernate.ddl-auto=none
(*schema.sqlはDDL(Data Definition Language、テーブル定義)で、data.sqlはDML(Data Manipulation Language、初期データ作成)です)

次に、schema.sqlを編集します。

create table if not exists diary (id integer generated by default as identity, comment varchar(255), create_datetime timestamp not null, primary key (id));
diaryテーブルを作成しているDDLですが、if not existsを付けています。これはDBをファイルベースで永続化する場合、diaryテーブルの作成は1度で十分であるためです。初回のアプリ起動時にdiaryテーブルを作成するだけです。

DBをインメモリで使う場合、アプリを起動するたびにテーブル定義もデータも初期化されるので、if not existsはあってもなくてもどちらでも構いません。

設定は以上です。これで、アプリを何度も起動し直してもデータは初期化されずにデータが永続化されます。

ちなみにファイルベースで使う設定をしてDBを初期化したい場合は、単にDBファイルを削除すればいいだけです。
上で書いた説明の場合、"hogefiledb.mv.db"ファイルを削除すればDBのデータが初期化されます。

最後に、今後について

今回は、H2のデータを永続化するために、ファイルベースで使うための設定について説明しました。

今後は、H2だけでなくMySQLなどの別のDBをSpring Bootで使用してみたり、Spring Data JPAについてや、Spring BootのウェブアプリやREST API(Web API)のサンプルアプリの作成などについて書いていこうと思います。

H2データベース入門【Spring Boot】トップに戻る

[広告] Kindle Unlimitedなら対象の本が定額で読み放題
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!

Spring Bootの記事

Spring Boot2で日記投稿ウェブアプリ開発入門トップページ
Spring Boot2.3,2.4でシンプルな日記投稿ウェブアプリの開発しながら、入門者・初心者にもわかりやすいように説明しています。DBを使用して、新規投稿、編集、削除、一覧表示という基本的なCRUD機能を備えたアプリです。