Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

JJUG CCC 2025 Spring発表
ふじきゃわ

Avatar for k.fujikawa8

k.fujikawa8

June 10, 2025
Tweet

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はオ ンプレミスや細かな設定が必要なケースに向け。