【こねくしょんぷーりんぐ】

コネクションプーリング とは?

💡 DB接続を「使い回す」仕組み
📌 このページのポイント
コネクションプーリング:接続の使い回し プールなし リクエスト1: 接続→クエリ→切断 リクエスト2: 接続→クエリ→切断 リクエスト3: 接続→クエリ→切断 リクエスト4: 接続→クエリ→切断 毎回接続・切断でオーバーヘッド大 プールあり アプリ リクエスト 1,2,3,4 プール DB 接続済 接続を再利用!高速 接続4回 × 切断4回 = 8回 オーバーヘッド大 接続1回 → 4リクエスト処理 オーバーヘッド小 データベース接続を使い回してパフォーマンス向上
コネクションプーリングのイメージ
ひよこ ひよこ

なぜ毎回接続するのはダメなの?

ペンギン先生 ペンギン先生

DB接続の確立にはTCP 3ウェイハンドシェイク→TLS握手→DB認証→セッション初期化で数十msかかる。リクエストごとにこれを繰り返すとレスポンス時間が大幅に増加する。1秒に1000リクエスト来るシステムなら、毎回接続だと接続処理だけで数十秒分のリソースを消費するんだよ

ひよこ ひよこ

プールのサイズはどう決める?

ペンギン先生 ペンギン先生

HikariCPの公式が面白い公式を出しているよ。「最大プールサイズ = (コア数 × 2) + ディスク数」。CPUバウンドなクエリならコア数に比例、I/OバウンドならI/O待ちの分だけ増やせる。大きすぎるとDB側の接続数上限に達して逆に詰まるから注意。小さすぎると接続待ちが発生する。負荷テストで最適値を見つけるのが確実だよ

ひよこ ひよこ

サーバーレスとの相性は?

ペンギン先生 ペンギン先生

これが実は大きな課題なんだ。Lambda等のサーバーレスは同時起動数が数千になることがあり、各インスタンスがDB接続を持つと接続数が爆発する。RDS ProxyやPgBouncerなどの外部コネクションプーラーを挟んで、Lambda→プーラー→DBという構成にするのが定番の解決策だよ

ひよこ ひよこ

コネクションリークって何?

ペンギン先生 ペンギン先生

取得した接続をプールに返却し忘れること。try-finallyやtry-with-resourcesで確実にcloseしないと、プールの接続が枯渇して新しいリクエストが処理できなくなる。HikariCPはリーク検出機能(leakDetectionThreshold)があって、一定時間返却されない接続をログに出してくれるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コネクションプーリング」って出てきたら「DB接続を使い回してパフォーマンスを上げる仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Connection Pooling」 = 接続のプール管理
💬 Pool(溜め池)に接続をためておいて、必要な時に取り出して使うイメージだよ
← 用語集にもどる