【こねくしょんぷーる】

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

最終更新:
💡 DB接続を、借りて使って返す

データベース接続などを管理し、借りて使った後に返して再利用する仕組み。接続数の上限・返却・複数インスタンスでの考え方を説明します。

📌 このページのポイント
接続を借りて、使って、返すアプリの処理借りた接続でDBを使うエラー時も返却する接続プール管理している接続次の処理で再利用借りる ← / 返す →必要になった時に作る実装もある上限・待ち時間と、DB全体の容量も確認
矢印はプールから借り、処理後に返す関係です。通常の返却は物理的な切断と異なり、返却漏れや接続上限で待機が生じます。
ひよこ ひよこ
DBにつなぐたびに、新しい接続を作るの?
ペンギン先生 ペンギン先生
プールを使うと、管理している接続を借りて使い、返して次の処理で再利用できるよ。毎回接続を作る手間を抑える仕組みだね。
ひよこ ひよこ
起動時に、上限まで全部つなぐ?
ペンギン先生 ペンギン先生
必ずではないよ。例えばnode-postgresのPoolは空で作られ、必要になったときに接続を作る。上限の設定は、最初からその本数を作るという意味ではないんだ。
ひよこ ひよこ
借りられる接続が、なくなったら?
ペンギン先生 ペンギン先生
上限に達して全部使用中なら、接続が返るまで待つことがあるよ。node-postgresにも待ち行列があり、設定によってはタイムアウトになる。上限を増やすだけで、すべての遅さが解決するわけではないね。
ひよこ ひよこ
使い終わった接続は、どうする?
ペンギン先生 ペンギン先生
借りた接続を、エラー時も含めて返す必要があるよ。node-postgresなら通常はclient.release()で返す。返却漏れで接続を使い切ると、後の処理が待機やタイムアウトになるんだ。
ひよこ ひよこ
プールの大きさは、全アプリで同じでよい?
ペンギン先生 ペンギン先生
DBにつなぐ全インスタンスの合計を考えよう。台数が増えると、各プールの上限も積み重なる。DBの容量や管理用の余裕、処理の待ち時間を見て決めるので、全環境に共通の計算式ではないんだ。
もっと詳しく知りたい人へ

トランザクションも、毎回別の接続でよい?

node-postgresでは、一つのトランザクションに同じクライアントを使います。pool.queryを個別に呼ぶと別の接続へ割り当てられることがあるため、トランザクションには使わないと公式APIが案内しています。

サーバーレスなら、接続は毎回作り直す?

実行環境によります。公式のPool Sizingは、実行環境が維持され接続を再利用できる場合と、リクエスト後に実行環境が終了する場合を分けています。プールやプロキシの採用だけで、接続容量の検討が不要になるわけではありません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コネクションプール」って出てきたら「DB接続などを、借りて返して再利用する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Connection pool」 = 接続を蓄えて管理する仕組み
💬 ここではDB接続を例に説明します。借りた接続をプールへ返すことと、DBとの物理的な接続を切ることは区別します。

参考資料

← 用語集にもどる