【こねくしょんぷーる】

コネクションプール とは?

💡 DB接続を「使い回す」ための接続のストック
📌 このページのポイント
コネクションプール アプリケーション リクエスト1 リクエスト2 リクエスト3 リクエスト4 待機 コネクションプール コネクション1 【使用中】 コネクション2 【使用中】 コネクション3 【使用中】 コネクション4 【待機中】 返却 データベース DB 使用中 待機中 接続を使い回すことで、接続・切断のオーバーヘッドを削減
コネクションを事前に確保・使い回してDB接続を効率化する仕組み
ひよこ ひよこ

DB接続ってそんなに時間がかかるの?

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

TCP接続の確立、認証処理、セッション初期化などで数十ミリ秒かかる。1回なら大したことないけど、Webアプリで毎リクエストごとに接続・切断を繰り返すと膨大な無駄になる。コネクションプールなら最初に確立した接続を使い回すから、その無駄がなくなるんだ。

ひよこ ひよこ

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

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

大きすぎるとDBサーバーのメモリやCPUを圧迫するし、小さすぎると接続待ちが発生する。一般的には「CPUコア数 × 2 + ディスク数」が目安と言われている(HikariCPの推奨値)。ただしこれも負荷パターンによるから、実際に計測して調整するのが大事。

ひよこ ひよこ

接続が返却されないとどうなるの?

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

コネクションリークという問題が起きる。プールの接続が全部借りっぱなしになると、新しいリクエストが接続を取得できずにタイムアウトしてアプリが止まる。try-finallyやusingで確実にcloseする、リークを検知するタイムアウト設定を入れるなどの対策が必要だよ。

ひよこ ひよこ

サーバーレス環境だとコネクションプールが問題になるって聞いたけど?

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

いいところに気づいたね。Lambda等のサーバーレスは呼び出しごとにインスタンスが起動・破棄されるから、各インスタンスがプールを作ると接続数が爆発する。100個のLambdaが同時に10接続ずつプールしたら1000接続になってDBが耐えられない。AWS RDS ProxyやPgBouncerのような「DBの前に立つプロキシ型のプール」で接続を集約するのが定番の解決策なんだけど、プロキシ自体がボトルネックになるケースもあって、設計の見極めは簡単じゃないんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
コネクションプールって出てきたら「DB接続を事前に確保して使い回す仕組みで、接続コストを減らす」と思えばだいたいOK!
📖 おまけ:英語の意味
「Connection Pool」 = 接続(Connection)のプール(Pool=貯め池)
💬 水のプール(貯め池)のように、接続を貯めておいて必要なときに取り出すイメージ
← 用語集にもどる