コネクションプール こねくしょんぷーる
DB接続パフォーマンススループットPgBouncer接続数上限Webアプリ
コネクションプールについて教えて
簡単に言うとこんな感じ!
コネクションプールは「DB接続をあらかじめ作り置きして使い回す」仕組みだよ! 毎回レストランに予約電話してから入店するのはムダ。常連席として確保しておいて、来たらすぐ座れる感じ。DB接続のコストは意外と高いから、再利用することで速くなるんだ!
コネクションプールとは
コネクションプール(Connection Pool)とは、データベースへの接続(コネクション)をあらかじめ一定数作成・保持しておき、アプリケーションからのリクエストに対して「確立済みのコネクション」を使い回す仕組みです。
DBへの接続確立にはTCPハンドシェイク・認証・セッション初期化などのオーバーヘッドがあり、数十〜数百ミリ秒かかることがあります。Webアプリケーションでは1秒間に数百〜数千リクエストが来ることもあり、毎回新規接続を作るとこのオーバーヘッドが積み重なりパフォーマンスが大幅に劣化します。コネクションプールがあれば接続は再利用されるため、この問題を解消できます。
また、DBサーバーには最大接続数の上限があります(PostgreSQLのデフォルトは100)。Webサーバーが大量に起動していると、各サーバーが個別にコネクションを張ろうとして上限を超えてしまいます。コネクションプールで集中管理することで、DBへの接続数を適切に制御できます。
コネクションプールの仕組み
主要なコネクションプール製品
| 製品 | 種別 | 対応DB | 特徴 |
|---|---|---|---|
| PgBouncer | 外部プロセス型 | PostgreSQL専用 | 軽量・高性能。本番でのデファクトスタンダード |
| pgpool-II | 外部プロセス型 | PostgreSQL | 負荷分散・レプリカ振り分け機能も持つ |
| HikariCP | アプリ組み込み型 | 汎用 | Javaアプリの定番。Spring Boot標準 |
| connection_pool(psycopg3) | アプリ組み込み型 | PostgreSQL | Pythonアプリ向け |
| ProxySQL | 外部プロセス型 | MySQL | 読み書き分離・クエリルーティング機能も持つ |
歴史と背景
- 1990年代後半:WebサーバーとDBの間のボトルネックとして接続コストが認識され始める
- 2000年代初頭:Java EEのコネクションプール(DBCP・C3P0)がアプリ組み込み型の標準になる
- 2007年:PgBouncerが公開。PostgreSQL向け外部コネクションプーラーとして広く普及
- 2013年:HikariCPが公開。「最速のJava接続プール」として急速に普及し、Spring Bootのデフォルトに採用
- 現在:サーバーレス環境・コンテナの普及で「一時的に大量のコネクションが発生する」問題が顕著化。AWS RDS Proxy・PlanetScaleなどクラウドが提供するマネージドプールサービスも増加
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| JDBC(JSR-221) | Javaのデータベース接続API仕様。コネクションプールの基盤インターフェース |
| ODBC | 言語共通のDBアクセス標準インターフェース |
関連用語
- レプリケーション — プールと組み合わせた読み書き分離構成でよく利用される
- シャーディング — 複数シャードへの接続管理にコネクションプールを活用
- クエリ最適化・実行計画 — クエリのパフォーマンスと並んでコネクションコストも重要
- トランザクション — プール内のコネクションはトランザクション単位で貸し出される
- ストアドプロシージャ — コネクションプールと組み合わせてDB処理を効率化する
- バックアップ・リストア — バックアップ取得時も接続数に注意が必要
- デッドロック — 接続プールの枯渇がデッドロックに似た問題を引き起こすことがある