コネクションプーリング
DB 接続の確立は重いため、作った接続を使い回す仕組みです。プールの動き、接続の枯渇、上限やタイムアウトの設定の勘所を解説します。
- 1.DB 接続の確立は認証や TCP のやり取りで重いので、毎回作らずプールに保持して使い回す。
- 2.アプリは接続を借りて使い、終わったら閉じずにプールへ返す。空き接続が再利用されるので往復が省ける。
- 3.プールの上限と DB 側の最大接続数の整合が肝。足りないと枯渇待ち、多すぎると DB が過負荷になる。
コネクションプーリングとは
アプリが DB を使うには、まず 接続(コネクション) を張る必要があります。ところがこの接続を 1 から作る処理は、見た目以上に重い作業です。TCP の確立、認証(パスワードや TLS のやり取り)、サーバー側でのセッション用メモリ確保などが毎回発生します。1 回あたり数ミリ秒でも、リクエストごとに繰り返せば無視できません。
コネクションプーリング は、あらかじめ作っておいた接続を プール(貯水池) にためておき、アプリが必要なときに借りて、使い終わったら返して 使い回す 仕組みです。
プールの動き
プールを使うと、接続のライフサイクルは「作る・捨てる」から「借りる・返す」に変わります。
- アプリは新規に接続を作るのではなく、プールから 空いている接続を借りる。
- クエリを実行し終えたら、接続を 閉じずにプールへ返す。
- 返された接続は次のリクエストで再利用される。実際の確立コストは初回だけで済む。
| 観点 | プールなし(都度接続) | プールあり(使い回し) |
|---|---|---|
| 接続の確立 | リクエストごとに毎回 | 起動時などにまとめて、以後は再利用 |
| 1 リクエストの往復 | 認証ぶん余計にかかる | 借りる・返すだけで軽い |
| DB 側のセッション数 | 急増しやすい | 上限内に収まる |
多くの言語やフレームワークでは、接続を close() する操作が「破棄」ではなく「プールへ返却」を意味するように作られています。コードの見た目は素朴な接続と同じでも、裏でプールが効いているわけです。
接続の枯渇と上限設定
プールに置ける接続の数には 上限(最大プールサイズ) があります。同時アクセスが増え、貸し出せる接続がすべて使用中になると、後続のリクエストは 空きが返ってくるのを待つ ことになります。これが 接続の枯渇(プール枯渇) です。待ち時間が長引けばタイムアウトし、ユーザーから見れば「DB が遅い・落ちた」ように見えます。
主な設定項目は次の通りです。
| 設定 | 意味 | 小さすぎると | 大きすぎると |
|---|---|---|---|
| 最大プールサイズ | 同時に貸し出せる接続の上限 | 枯渇して待ち・タイムアウト | DB の最大接続数を圧迫 |
| 最小(アイドル)数 | 常に確保しておく空き接続 | 急な増加に追従が遅い | 使わない接続を抱え続ける |
| 取得タイムアウト | 空きを待つ最大時間 | すぐ失敗扱いになる | 詰まりを長く引きずる |
| アイドルタイムアウト | 使われない接続を閉じるまでの時間 | 接続を頻繁に作り直す | 不要な接続が残る |
プールの最大サイズは、DB サーバー側の最大接続数(PostgreSQL なら max_connections)の範囲に収める必要があります。アプリのインスタンスを 10 台に増やし、各々がプール上限 100 を持てば、合計 1000 接続を要求します。DB 側がそこまで許可していなければ接続エラーが多発し、許可していてもメモリを食い潰して DB 全体が不安定になります。台数 × プール上限の合計を必ず見積もりましょう。
適切なサイズの考え方
「大きくすれば速い」とは限りません。DB が同時に効率よく捌けるクエリ数には限界があり、それを超える接続は 待ち行列を内部に作るだけ で、かえって全体のスループットを下げます。CPU コア数やディスク性能を踏まえ、まずは控えめなサイズから始め、実際の待ち時間や DB の負荷を見ながら調整するのが定石です。
アプリ側のプールに加えて、DB の手前に専用の接続プーラー(PostgreSQL の PgBouncer など)を置く構成もよく使われます。多数のアプリインスタンスやサーバーレス環境のように接続元が増減しやすい場合に、DB への実接続数を一定に抑えられるのが利点です。アプリ側は軽いプール、DB 直前で実接続を絞る、という二段構えが効きます。
コネクションプーリングは、重い接続確立を隠して性能を底上げする基本技術です。ポイントは上限値の設計に尽き、アプリの台数と DB の許容量を突き合わせて、枯渇も過負荷も避ける数に整えることが肝心です。
データベース Article
コネクションプーリングを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
コネクションプーリング
比較で見る軸
難易度: intermediate / カテゴリ: データベース / タグ数: 3
導入後に効く点
アプリは接続を借りて使い、終わったら閉じずにプールへ返す。空き接続が再利用されるので往復が省ける。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- データベース
- タグ数
- 3
判断チェックリスト
- 自社の用途が「コネクションプーリング / データベース」に近いか確認する。
- 強みである「DB 接続の確立は認証や TCP のやり取りで重いので、毎回作らずプールに保持して使い回す。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。