データベース管理・運用

コネクションプール こねくしょんぷーる

DB接続パフォーマンススループットPgBouncer接続数上限Webアプリ
コネクションプールについて教えて

簡単に言うとこんな感じ!

コネクションプールは「DB接続をあらかじめ作り置きして使い回す」仕組みだよ! 毎回レストランに予約電話してから入店するのはムダ。常連席として確保しておいて、来たらすぐ座れる感じ。DB接続のコストは意外と高いから、再利用することで速くなるんだ!


コネクションプールとは

コネクションプール(Connection Pool)とは、データベースへの接続(コネクション)をあらかじめ一定数作成・保持しておき、アプリケーションからのリクエストに対して「確立済みのコネクション」を使い回す仕組みです。

DBへの接続確立にはTCPハンドシェイク・認証・セッション初期化などのオーバーヘッドがあり、数十〜数百ミリ秒かかることがあります。Webアプリケーションでは1秒間に数百〜数千リクエストが来ることもあり、毎回新規接続を作るとこのオーバーヘッドが積み重なりパフォーマンスが大幅に劣化します。コネクションプールがあれば接続は再利用されるため、この問題を解消できます。

また、DBサーバーには最大接続数の上限があります(PostgreSQLのデフォルトは100)。Webサーバーが大量に起動していると、各サーバーが個別にコネクションを張ろうとして上限を超えてしまいます。コネクションプールで集中管理することで、DBへの接続数を適切に制御できます。


コネクションプールの仕組み

コネクションプールの構成 Webサーバー群 Webサーバー 1 Webサーバー 2 Webサーバー 3 …(100台) コネクションプール (PgBouncer / HikariCP 等) 接続 1(待機中) 接続 2(使用中) 接続 3(待機中) プールサイズ: 10〜20接続 DBサーバー 最大接続数: 100 プールが管理する 少数の接続のみ 100台×複数接続 プールで束ねて 10〜20接続に削減

主要なコネクションプール製品

製品種別対応DB特徴
PgBouncer外部プロセスPostgreSQL専用軽量・高性能。本番でのデファクトスタンダード
pgpool-II外部プロセス型PostgreSQL負荷分散・レプリカ振り分け機能も持つ
HikariCPアプリ組み込み型汎用Javaアプリの定番。Spring Boot標準
connection_pool(psycopg3)アプリ組み込み型PostgreSQLPythonアプリ向け
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アクセス標準インターフェース

関連用語