Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

データベースコネクションプール(DBCP)の変遷と理解

 データベースコネクションプール(DBCP)の変遷と理解

JJUG CCC 2025 Spring発表
ふじきゃわ

Avatar for k.fujikawa8

k.fujikawa8 PRO

June 10, 2025
Tweet

More Decks by k.fujikawa8

Other Decks in Programming

Transcript

  1. 基本のデータベース接続方法 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の実行など } } } 課題:接続の開始と終了で処理が重い
  2. 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(); } 接続プールの作成 プールから取得 プールの破棄
  3. どのようなDBCPライブラリがあるか • Apache Commons DBCP • HikariCP • Agroal •

    アプリケーションサーバの独自実装 TomcatやGlassfishなど • データベースベンダー/クラウドベンダーの独自実装 Oracle Universal Connection Pool AWS RDS Proxy など
  4. Tomcatの独自実装 • Tomcatが独自に開発したコネクションプール実装。 • Apache Commons DBCPのパフォーマンス問題を解決する ために開発された。 • Tomcatとの親和性が高い。

    • Tomcatのデフォルトとして採用されている。 • 主要設定項目はApache Commons DBCPと類似しているが、 実装が異なるため、パフォーマンス特性に差異がある。 https://tomcat.apache.org/tomcat-11.0-doc/jdbc-pool.html
  5. 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も利用可能
  6. 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 設定項目名(※抜粋)
  7. Commons系とTomcat独自実装の違い • 実装の軽量性とパフォーマンス: Tomcat独自実装はシンプル で軽量な実装を目指して設計され、 apache.commons.dbcp2よりも高負荷時のパフォーマンス が優れているとされる。 • Tomcat環境での適切な選択: Tomcat環境ではtomcat-jdbc-

    poolがデフォルトとなっており、推奨されている。 apache.commons系を使用する場合は設定項目や特性の違い を理解し、意図しない挙動が起きないように注意する必要あり。
  8. 原因①:DBCP設定項目の違い • Tomcat7⇒8でtomcat-dbcp.jar内のクラスが異なるため、 過去メンバーから引き継いだ設定項目名は無効扱いとなっていた。 • 当時のTomcatのcontext.xml設定 ・maxActive="20“ ・maxWait=“60000” (60秒) 設定内容

    DBCP1 DBCP2 デフォルト値 同時に割り当てることができるアクティブな接続 の最大数 maxActive maxTotal 8 利用可能な接続がない場合に、接続返却待ちをす る最大待機時間※ミリ秒。※-1 は無期限待機 maxWait maxWaitMillis -1
  9. 調査難航理由:設定ファイルの優先度 • 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が更新されたことで、 デフォルト値が利用される状態となっていた。
  10. コネクションプーリングの最新トレンド • Spring Bootの標準HikariCP: 軽量で爆速 • 外部管理型のコネクションプール(RDS Proxyなど): Java アプリケーション外部で管理することで、アプリケーションの

    負荷を大幅に軽減。 • 今後のDBCPライブラリの立ち位置: クラウドアプリの普及で、 軽量・高速なライブラリへの移行が加速している。Commons 系DBCPは保守や安定性を求める既存環境での利用が中心に。
  11. HikariCPとCommons系DBCPの違い • パフォーマンス: HikariCPは低レイテンシと高スループットを重視 した設計。apache.commons.dbcp2より優れた結果。 • 設定のシンプルさ: HikariCPは設定項目が少なく、直感的。一方、 commons-dbcp2は柔軟性がある反面、設定項目が多く学習コス トが高い。

    • 監視機能: HikariCPは統計情報の取得やログ出力機能が充実してお り、可観測性に優れる。 • 用途の傾向: HikariCPはSpring Bootのデフォルト。commons- dbcp2はレガシー環境や設定を細かく制御したいケースで使用され ることが多い。
  12. RDS ProxyとCommons系DBCPの違い • 管理の場所: RDS ProxyはAWSが提供するマネージドサービス であり、アプリケーション外で接続プールを管理。 • スケーラビリティ: RDS

    Proxyは複数のアプリケーションイン スタンスからの接続を効率よく統合し、スケーラビリティの高 い構成を実現可能。 • 運用負荷: RDS Proxyは自動で接続のヘルスチェックや再接続 を行うため、アプリケーション側での接続管理負荷を大幅に軽 減。 • 用途の傾向: RDS ProxyはAWSクラウド環境に最適化されてお り、サーバーレスなどとの相性が良い。commons-dbcp2はオ ンプレミスや細かな設定が必要なケースに向け。