Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
データベースコネクションプール(DBCP)の変遷と理解
Search
k.fujikawa8
June 10, 2025
Programming
0
180
データベースコネクションプール(DBCP)の変遷と理解
JJUG CCC 2025 Spring発表
ふじきゃわ
k.fujikawa8
June 10, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
TypeScript だけを書いて Tauri でデスクトップアプリを作ろう / Tauri with only TypeScript
tris5572
2
550
Perlで痩せる
yuukis
1
670
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
260
セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用
kazumura
1
130
プロダクト開発でも使おう 関数のオーバーロード
yoiwamoto
0
110
Blueskyのプラグインを作ってみた
hakkadaikon
1
360
漸進。
ssssota
0
1.5k
【TSkaigi 2025】これは型破り?型安全? 真実はいつもひとつ!(じゃないかもしれない)TypeScript クイズ〜〜〜〜!!!!!
kimitashoichi
1
300
型安全なDrag and Dropの設計を考える
yudppp
5
690
事業戦略を理解してソフトウェアを設計する
masuda220
PRO
16
5.1k
Using AI Tools Around Software Development
inouehi
0
280
Cursor Meetup Tokyo ゲノミクスとCursor: 進化と制約のあいだ
koido
2
820
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
39
1.8k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.3k
How to Ace a Technical Interview
jacobian
276
23k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Rails Girls Zürich Keynote
gr2m
94
13k
Fontdeck: Realign not Redesign
paulrobertlloyd
84
5.5k
A designer walks into a library…
pauljervisheath
205
24k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
Typedesign – Prime Four
hannesfritz
42
2.6k
Speed Design
sergeychernyshev
30
980
Transcript
データベースコネクションプール (DBCP)の変遷と理解 JJUG CCC 2025 Spring (6/7) 株式会社ケープロジェクト ふじきゃわ
自己紹介 • ふじきゃわ • 元テレビのAD(アシスタントディレクター) • 好きなものはとんかつとペンギン • Java歴7年 •
現在20年もののERP保守中
目次 • コネクションプールの概要 • Tomcatでのコネクションプール • コネクションプールの最新情報 • まとめ
コネクションプールの概要 そもそも・・・ データベースコネクションプールって?
データベースコネクションプールとは データベースへの接続コネクションを プール(つまり再利用可能なリソースの集まり) として貯めて、管理する技術。 以降のスライドでは 「DBCP」と呼びます。
なぜ DBCPは必要なのか?
データベースへの接続確立 SQLの実行 接続の終了 処理イメージ(基本のDB接続) Java DB Java DB データベースへの接続確立 SQLの実行
接続の終了 なぜコネクションプーリングが必要なのか?
基本のデータベース接続方法 public static void main(String[] args) throws SQLException { String
url = "jdbc:h2:tcp://localhost/~/test"; String u = "sa"; //user String p = ""; //pass for (int i = 0; i < 5; i++) { try (Connection conn = DriverManager.getConnection(url,u,p)) { //DB処理 SQLの実行など } } } 課題:接続の開始と終了で処理が重い
DBCPの基本概念 Javaから通信毎に接続を開閉すると非効率なので・・・ DataBase Connection Pool(DBCP)が、 接続を事前に確保し、プールに保持。 リクエストが来ると、プールから既存の接続を取得し、 リクエストが終了するとその接続はプールに返却されます。
データベースへの接続確立 SQLの実行 接続の終了 処理イメージ(基本のDB接続) Java DB Java DB データベースへの接続確立 SQLの実行
接続の終了 なぜコネクションプーリングが必要なのか?
SQLの実行 接続の終了 処理イメージ(コネクションプーリング) Java DB Java DB データベースへの接続確立 SQLの実行 なぜコネクションプーリングが必要なのか?
DBCPを使った接続方法 public static void main(String[] args) throws SQLException { BasicDataSource
ds = new BasicDataSource(); ds.setUrl("jdbc:h2:tcp://localhost/~/test"); ds.setUsername("sa"); ds.setDriverClassName("org.h2.Driver"); for (int i = 0; i < 5; i++) { try (Connection conn = ds.getConnection()) { //DB処理 SQLの実行など } } ds.close(); } 接続プールの作成 プールから取得 プールの破棄
どのようなDBCPライブラリがあるか • Apache Commons DBCP • HikariCP • Agroal •
アプリケーションサーバの独自実装 TomcatやGlassfishなど • データベースベンダー/クラウドベンダーの独自実装 Oracle Universal Connection Pool AWS RDS Proxy など
コネクションプールを使う上での問題点 • 設定ミスによるパフォーマンス悪化: 不適切な設定により逆に性能が低下する可能性がある。 • Tomcat特有の問題点: バージョンアップ時の設定引き継ぎの 漏れや、異なる設定ファイル間の優先度による設定の競合。 システム設計や運用時のパフォーマン ス改善、安定性向上に繋げたい
今回対象とするライブラリ • Apache Commons DBCP • Tomcatの独自実装 • HikariCP •
RDS Proxy
Apache Commons DBCP • Apacheが提供 • オープンソースのコネクションプールライブラリ。 • Javaアプリケーションにおけるデータベース接続管理を容易 にすることを目的として開発。
• 非常に古くからあるため、多くのアプリケーションで採用。 https://commons.apache.org/proper/commons-dbcp/
Tomcatの独自実装 • Tomcatが独自に開発したコネクションプール実装。 • Apache Commons DBCPのパフォーマンス問題を解決する ために開発された。 • Tomcatとの親和性が高い。
• Tomcatのデフォルトとして採用されている。 • 主要設定項目はApache Commons DBCPと類似しているが、 実装が異なるため、パフォーマンス特性に差異がある。 https://tomcat.apache.org/tomcat-11.0-doc/jdbc-pool.html
HikariCP • 高速かつ軽量な人気コネクションプールライブラリ。 • Spring Bootのデフォルトコネクションプールとして採用され、 近年広く使われるようになった。 • 特徴はシンプルさとパフォーマンスの高さで、設定項目も少な く直感的。
• 高負荷環境においても安定したパフォーマンスを提供。 https://github.com/brettwooldridge/HikariCP
RDS Proxy • AWSが提供するマネージド型のコネクションプールサービス。 • コネクションプールをアプリケーションの外部で提供し、 接続管理の負担を軽減。 • データベース接続のスケーラビリティと安定性を高めるため、 クラウドベースのアプリケーションで広く採用。
• 接続漏れ問題やデータベースへの接続数上限問題の対策として も効果的。 https://aws.amazon.com/jp/rds/proxy/
目次 • コネクションプールの概要 • Tomcatでのコネクションプール • コネクションプールの最新情報 • まとめ
Tomcatでのコネクションプール
Tomcatでのコネクションプール 概要 • DBCPは当初、 Apache Commons DBCP 1系を利用。 • パフォーマンス課題解決等のためにTomcatの独自実装が誕生。
• Apache Commons DBCP 2系がリリースされる。 • Tomcatは引き続き独自実装を利用。ただし、明示的に設定す れば Apache Commons DBCP 2.x を使うことが可能に。 version デフォルトライブラリ Tomcat 4〜6 Apache Commons DBCP 1.x Tomcat 7 Tomcat独自実装 tomcat-jdbc.jar Tomcat 8.5 Tomcat独自実装 tomcat-jdbc.jar ※Apache Commons DBCP 2.xも利用可能
tomcat-dbcp.jar Commons系とTomcat独自実装の関連 org.apache.commons.dbcp (DBCP1) org.apache.tomcat.dbcp.dbcp (Tomcat7 に内蔵) 改善&Tomcat最適化 進化&設定名変更 org.apache.commons.dbcp2
(DBCP2) org.apache.tomcat.dbcp.dbcp2 (Tomcat8~ に内蔵) 設定名を同様に アップデート
Apache.Commons系DBCPの変遷 • org.apache.commons.dbcp (DBCP1): 安定性や信頼性は高かったが、高負荷時のパフォーマンス問題 や接続漏れ時の問題が指摘された。 • org.apache.commons.dbcp2 (2014年頃に登場): •
JDK 7以上に最適化され、パフォーマンスとメモリ管理が改善。 • コネクション管理の効率化と、より高度なスレッド管理が実現された。 • いくつかの設定項目名が変更 設定内容 DBCP1 DBCP2 デフォルト値 同時に割り当てることができるアクティブな接続の最大数 maxActive maxTotal 8 利用可能な接続がない場合に、接続返却待ちをする最大待機時間 ※ミリ秒。※-1 は無期限待機 maxWait maxWaitMillis -1 プール内でアイドル状態を維持できる接続の最大数 maxIdle 8 設定項目名(※抜粋)
commons.dbcp (DBCP1)の問題 • 問題①:シングルスレッドで、スレッドセーフではなかった。 そのため、接続の割り当てと返却時にプール全体のロックが発生 していた。 • 問題②:サーバー側の論理CPUが増え、プールから接続の 借用・返却が増えると、パフォーマンスが低下する問題があった。
Tomcatの独自実装DBCPの変遷 • org.apache.tomcat.dbcp.dbcp (Tomcat 7~): commons.dbcp (DBCP1)の性能問題を解決し、Tomcatの ログ出力機能などを使うなど、Tomcatに最適化。 • org.apache.tomcat.dbcp.dbcp2
(2014年頃 Tomcat8~): 設定項目名がcommons.dbcp2 (DBCP2)と同様のものが使用 されるように変更。
tomcat-dbcp.jar Commons系とTomcat独自実装の関連 org.apache.commons.dbcp (DBCP1) org.apache.tomcat.dbcp.dbcp (Tomcat7 に内蔵) 改善&Tomcat最適化 進化&設定名変更 org.apache.commons.dbcp2
(DBCP2) org.apache.tomcat.dbcp.dbcp2 (Tomcat8~ に内蔵) 設定名を同様に アップデート
Commons系とTomcat独自実装の違い • 実装の軽量性とパフォーマンス: Tomcat独自実装はシンプル で軽量な実装を目指して設計され、 apache.commons.dbcp2よりも高負荷時のパフォーマンス が優れているとされる。 • Tomcat環境での適切な選択: Tomcat環境ではtomcat-jdbc-
poolがデフォルトとなっており、推奨されている。 apache.commons系を使用する場合は設定項目や特性の違い を理解し、意図しない挙動が起きないように注意する必要あり。
しくじり体験談 お客様の声 「優先度は低いので早急な調査は必要ありませんが、 ある日突然アプリに接続できなくなり、問題が発生します。」 「でもTomcatを再起動すれば直るので、 とりあえず1日1回サーバー再起動スケジュールを組みました。」 「だいぶ良くなったんですが、やっぱりまだ起きるんですよね。」 「昔はこんなことなかったのに・・・。」 「データが溜まってパフォーマンスが低下してきたのかな・・。」
しくじり体験談 アプリ構成 • 20年前に作成されたERP • MWは年々更新され、 Tomcatは8.5まで更新済み Struts フレームワーク 認証APP
WEBAPP
はたして原因は・・・。 フレームワーク が古い? データの溜まり すぎ? そもそも 気のせい?
問題の一つにDBCPがありました。
原因①:DBCP設定項目の違い • Tomcat7⇒8でtomcat-dbcp.jar内のクラスが異なるため、 過去メンバーから引き継いだ設定項目名は無効扱いとなっていた。 • 当時のTomcatのcontext.xml設定 ・maxActive="20“ ・maxWait=“60000” (60秒) 設定内容
DBCP1 DBCP2 デフォルト値 同時に割り当てることができるアクティブな接続 の最大数 maxActive maxTotal 8 利用可能な接続がない場合に、接続返却待ちをす る最大待機時間※ミリ秒。※-1 は無期限待機 maxWait maxWaitMillis -1
原因②:複数接続が必要な機能があった • 認証アプリ側に接続を一度に複数利用する処理があった。 • パスワード変更等で何度も繰り返すと接続が一気に増大する仕 様となっていた。 • Tomcatが古い時代は、設定値が有効なので、 コネクション枯渇時の待機時間が60秒制限されていたが、 新Tomcatでは設定が無期限待機扱いとなってしまい、
枯渇した場合、アプリは止まってしまっていた。。。。
調査難航理由:設定ファイルの優先度 • Tomcatのcontext.xmlがアプリケーションごとに点在し、ま た、フレームワークのstruts-config.xmlどちらにもDBCPの 設定が違う状態で存在していた。 認証アプリ context.xml struts-config.xml WEBAPP context.xml
Commons系DBCP1利用設定 DBCP設定記載なし Commons系DBCP1利用設定 Tomcatではcontext.xmlの設定が優先される。 この場合Tomcatの独自実装が利用され、 Tomcatが更新されたことで、 デフォルト値が利用される状態となっていた。
解決方法 • JconsoleなどでDBCPのコネクション数を確認し最適な設定値 を選択。最大コネクション数の増加とタイムアウト時間追加 • バージョンの正しい設定値をcontext.xmlに反映 • 以上で、謎の問題が解消することができました。
目次 • コネクションプールの概要 • Tomcatでのコネクションプール • コネクションプールの最新情報 • まとめ
コネクションプールの最新情報 トレンド
コネクションプーリングの最新トレンド • Spring Bootの標準HikariCP: 軽量で爆速 • 外部管理型のコネクションプール(RDS Proxyなど): Java アプリケーション外部で管理することで、アプリケーションの
負荷を大幅に軽減。 • 今後のDBCPライブラリの立ち位置: クラウドアプリの普及で、 軽量・高速なライブラリへの移行が加速している。Commons 系DBCPは保守や安定性を求める既存環境での利用が中心に。
HikariCPとCommons系DBCPの違い • パフォーマンス: HikariCPは低レイテンシと高スループットを重視 した設計。apache.commons.dbcp2より優れた結果。 • 設定のシンプルさ: HikariCPは設定項目が少なく、直感的。一方、 commons-dbcp2は柔軟性がある反面、設定項目が多く学習コス トが高い。
• 監視機能: HikariCPは統計情報の取得やログ出力機能が充実してお り、可観測性に優れる。 • 用途の傾向: HikariCPはSpring Bootのデフォルト。commons- dbcp2はレガシー環境や設定を細かく制御したいケースで使用され ることが多い。
HikariCPとCommons系DBCPの違い https://github.com/brettwooldridge/HikariCP
RDS ProxyとCommons系DBCPの違い • 管理の場所: RDS ProxyはAWSが提供するマネージドサービス であり、アプリケーション外で接続プールを管理。 • スケーラビリティ: RDS
Proxyは複数のアプリケーションイン スタンスからの接続を効率よく統合し、スケーラビリティの高 い構成を実現可能。 • 運用負荷: RDS Proxyは自動で接続のヘルスチェックや再接続 を行うため、アプリケーション側での接続管理負荷を大幅に軽 減。 • 用途の傾向: RDS ProxyはAWSクラウド環境に最適化されてお り、サーバーレスなどとの相性が良い。commons-dbcp2はオ ンプレミスや細かな設定が必要なケースに向け。
SQLの実行 接続の終了 RDS Proxy処理イメージ Java DB(RDS) Java DB(RDS) データベースへの接続確立 SQLの実行
なぜコネクションプーリングが必要なのか?
今後のコネクションプールライブラリ • 冒頭に紹介した通り、多種のライブラリが登場している。 • 中でもSpringの標準であるHikariCPは優秀 • DB側でコネクションプーリングをするライブラリも増えてき ており、直接DBサーバーのリソースを使えるので、運用によ い影響を与えそうです。 Tomcat
独自実装DBCP OUCP (Oracle Universal Connection Pool) AWS RDS Proxy Commons系 DBCP HikariCP
目次 • コネクションプールの概要 • Tomcatでのコネクションプール • コネクションプールの最新情報 • まとめ
まとめ DBCPの変遷を理解して
バージョンや環境による挙動の違いを理 解することが重要 • 同じ名前のライブラリや設定でも、中身が異なったり意味合い が変わることが歴史的にあり得る。 • 手順だけを引き継いでいくと、将来問題が発生する可能性あり • 今を知るには、歴史を紐解く必要があり、それが将来に繋がる。 •
設定を簡略化するためのデフォルト設定は理解が必要。 • サーバーのパフォーマンスが上がり、通信の過密度が増し、小 さな遅延を解消していく世の中が進んでいる気がします。
謝辞 本セッションの準備にあたり、 企画のアドバイスをいただいた ゆとりさん、 資料作りの遅い私に温かくレビューくださった いとうちひろさん 日頃から技術コミュニティで支えてくださっている皆様に感謝いたし ます。 また、JavaコミュニティとJJUGの皆様に心より御礼申し上げます。
ご清聴ありがとうございました