Spring Boot

Spring BootであえてJNDIデータソースを使う

はじめに

本来、Spring Bootの流儀では後者の「アプリケーション管理(HikariCP)」に移行するのが一般的です。しかし、今回は「既存のレガシーコード(JNDIルックアップ実装)が残っている」ため、管理を一本化するために「コンテナ管理(JNDI)」に設定を寄せました。

データソースを用意するには一般的にインフラ層(Tomcat)で管理するか、アプリ層(SpringBoot)で管理するか次の2つの方法があります。

コンテナ管理データソース (Container-Managed DataSource)

Tomcat側でプールを持つ方式です。

  • 正式な呼び方: 「コンテナ管理データソース」または「JNDIデータソース」
  • 管理主体: Tomcat(サーブレットコンテナ)
  • 特徴: * DB接続情報やプールの設定(最大接続数など)を context.xmlserver.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>

スポンサーリンク
タイトルとURLをコピーしました