はじめに
本来、Spring Bootの流儀では後者の「アプリケーション管理(HikariCP)」に移行するのが一般的です。しかし、今回は「既存のレガシーコード(JNDIルックアップ実装)が残っている」ため、管理を一本化するために「コンテナ管理(JNDI)」に設定を寄せました。
データソースを用意するには一般的にインフラ層(Tomcat)で管理するか、アプリ層(SpringBoot)で管理するか次の2つの方法があります。
コンテナ管理データソース (Container-Managed DataSource)
Tomcat側でプールを持つ方式です。
- 正式な呼び方: 「コンテナ管理データソース」または「JNDIデータソース」
- 管理主体: Tomcat(サーブレットコンテナ)
- 特徴: * DB接続情報やプールの設定(最大接続数など)を
context.xmlやserver.xmlに記述する。- 複数のアプリ(WAR)を同じTomcatに載せる場合、DB接続をコンテナ側で一元管理できる。
- アプリ側からは JNDIルックアップ という仕組みを使って「名前」でコネクションを借りる。
アプリケーション管理データソース (Application-Managed DataSource)
Spring Boot(アプリ)の中でプールを持つ方式です。
- 正式な呼び方: 「アプリケーション管理データソース」または「ローカルデータソース」
- 管理主体: アプリケーション(Spring Boot / HikariCP)
- 特徴:
application.properties(yml) にDBのURLやパスワードを直接記述する。- アプリが起動する際に、アプリ内部で HikariCP などのプールを初期化する。
- 外部のJNDI設定に依存しないため、開発環境(Embedded Tomcat)と本番環境で同じ仕組みを使いやすく、現在のモダンな開発では主流。
JNDIデータソースを利用するための設定
application.properties の設定
Spring Bootに対して「自分でプール(HikariCP)を作らず、Tomcatにあるこれを使ってね」と教える設定です。
# Tomcatの context.xml 等で定義した名前を指定
spring.datasource.jndi-name=java:comp/env/jdbc/YourDSName
# (重要) HibernateがJNDIから適切な方言(Dialect)を推測できない場合があるため明示
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
# ※利用しているDBに合わせて変更(MySQLDialect, OracleDialectなど)
# 余計なコネクション保持を防ぐ
spring.jpa.open-in-view=false
Tomcat側(context.xml)の設定
実際にコネクションを物理的に保持するのはTomcatの役割です。
<Resource name="jdbc/YourDSName"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/yourdb"
username="sooni"
password="password"
maxTotal="20"
maxIdle="10"
maxWaitMillis="-1"/>
pom.xml の設定(ビルド構成)
Spring Bootに内蔵されているTomcatと、デプロイ先のTomcatが衝突しないようにします。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
