29
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

spring bootで組み込みh2dbを利用する方法

Last updated at Posted at 2018-11-11

1. はじめに

諸事情によりspring bootのWebアプリを作ることになりました。その際、組み込みh2dbを利用することなったので、その際、困ったことや調べたことをまとめました。
ちなみにspring bootのバージョンは1系の1.5.17です。

2. pom.xmlに依存関係を追加

pom.xmlの依存関係にspring-boot-starter-jdbch2を追加します。
Spring Initializrでプロジェクトを作成する場合は以下の2つを追加すれば同じになります。

  • H2
  • JDBC
追加する依存関係
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
	<groupId>com.h2database</groupId>
	<artifactId>h2</artifactId>
	<scope>runtime</scope>
</dependency>

3. application.properties(.yml)に設定を追加

application.propertiesもしくはapplication.ymlに以下の設定を追加します。
設定内容は以下の3つです。

  • datasourceの設定
  • コネクションプールの設定(必要なら)
  • h2の便利ツールの設定(必要なら)
src/main/resources/application.propertie
# datasource
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:./h2db/sampledb
spring.datasource.username=username
spring.datasource.password=password

# connection pool use tomcat
spring.datasource.tomcat.maxActive=10
spring.datasource.tomcat.maxIdle=10
spring.datasource.tomcat.minIdle=10
spring.datasource.tomcat.initialSize=10
spring.datasource.tomcat.defaultAutoCommit=false

# h2 for debug tool
# spring.h2.console.enabled=true
# spring.h2.console.path=/h2-console
# spring.h2.console.settings.web-allow-others=true

各設定の内容は公式ガイドラインのappication.propertiesの説明に書かれています。
以下、ポイントを説明します。

connection pool はプールとしてだけ利用する

spring.datasource.tomcat.*= # Tomcat datasource specific settings
とあるのでTomcatのdatasourceの定義と同様にdriverClass,url,username,passwordも定義して、spring.datasource.url等を削除しました。
これはダメみたいです。あくまでプールとしてだけ定義するのが正しいみたいです。

組み込みDB、つまり同一JVMプロセスなのにプールが必要?と思われる方もいると思いますが、著者も同様です汗。一般的なWebアプリなら必要だよね、ということで設定しています。性能測定はしていないの効果は不明です。

誤り
# datasource
# nothing see connection pool

# connection pool use tomcat
spring.datasource.tomcat.driver-class-name=org.h2.Driver
spring.datasource.tomcat.url=jdbc:h2:./h2db/sampledb
spring.datasource.tomcat.username=username
spring.datasource.tomcat.password=password
spring.datasource.tomcat.maxActive=10
spring.datasource.tomcat.maxIdle=10
spring.datasource.tomcat.minIdle=10
spring.datasource.tomcat.initialSize=10
spring.datasource.tomcat.defaultAutoCommit=false

h2の便利機能はデバッグとして利用する

組み込みDBでもh2のWeb管理機能を利用することができます。
組み込みDBはアプリと同じJVMプロセスで動作し、専用DBのためネットワーク接続できないためデバッグするのはメンドウでした。
Web管理機能を使うと現在のDBのデータを参照したり、変更できるようになります。

# h2 for debug tool
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.h2.console.settings.web-allow-others=true

デバッグ機能なのでapplication.propetiesに有効な状態で設定するのではなく、システムプロパティで有効にするのがいいでしょう。
これなら設定ファイルの修正を忘れても、デバッグ機能は無効のままで安心です。

java -jar your-app.jar -Dspring.h2.console.enabled=true -Dspring.h2.console.path=/h2-console -Dspring.h2.console.settings.web-allow-others=true

ちなみにspring.h2.console.settings.web-allow-othersはリモート(別PC)からのアクセスを許可するかどうかです。デフォルトのfalseではローカルから、つまりアプリを実行しているPCからしかアクセスできません。

4. DBやテーブルの準備

h2dbはインメモリのDBですが、組み込みDBではデータは永続化することができます。
ということは、起動する毎に毎回初期化されてしまうと困ります。

  • h2dbは接続文字列で指定したdbが存在しない場合は自動で作成する
    • 存在する場合は新規作成(初期化)しない
  • CREATE TABLE IF NOT EXISTSで初期化SQLを定義する
    • テーブルが存在する場合は再作成されない
  • jdbc:h2:./h2db/sampledbは実行時のカレントディレクトリから相対で見たパス(./h2db/sampledb)にDBファイルを格納する意味である
    • 相対パス指定は./が重要

5. jdbcTemplate、datasource、トランザクション制御は自動で設定される

springframeworkを素で利用すると、DBアクセスで必要ないろいろな設定(Bean定義やAOP等)が必要ですが、spring bootの場合は自動で設定されます。

  • datasourceのBeanが自動で設定される
  • JdbcTemplate,NamedParameterJdbcTemplateのBeanが自動で設定される
    • すぐに@Autowired等でインジェクションができる
  • @Transactionalによるトランザクション制御が有効

6. さいごに

今回はpring bootのWebアプリで、組み込みh2dbを利用する方法について、困ったことや調べたことをまとめました。
実際にやってみて、予想以上に設定が少なかったので驚きました。そう意味ではspring bootはお手軽ですね。

29
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?