DBの基礎 - コネクションプーリングについて


コネクションプーリングについて、わかっていないことが多すぎたので、ちょっとだけ調べたことをメモで残しておきます。
今はまだ触りレベルしかわかっていなのいので、もう少しちゃんと分かるようになりたい!


🎳 [スライド] データベースの羅針盤

コネクションプーリングを調べている過程で偶然見付け足資料
データベース技術の羅針盤』。
とにかくわかりやすくて、俯瞰的にDBの業界を知ることができる資料。すばらしすぎる。

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

DBのコネクションを一定数確立しておいて、それを使いまわす手法のこと。
DBへの接続に必要となるオーバーヘッドをカットしてWeb/DBの双方の負荷を下げる。
また、WebとDBの接続を使いまわすことで同時接続数を節約する。
用意した、コネクション数を超えたアクセスは、コネクションに空きがでるまで待たされる。

以下はOracle関連の話ですが、基本はおんなじだと思います。

🗻 Oracle Connection Pooling

  - 新規のサーバープロセスの作成に必要な処理
    - OSに新しいプロセスを割り当ててもらう
    - プロセス空間をOracle用に初期化
    - Oracle SGAにアクセスできるように設定
    - Oracleを使えるようにするためのパラメータを読み込んで初期化

(1)OracleでSQLを実行にかかるコストと、コネクションを生成するコストを比較
した場合、コネクション生成のほうが圧倒的にコストが高くなるそうです。

🐯 コネクションのマイナス要素

コストが高い一方で、コネクションを持ちすぎることには次のマイナス要素がある

  - 接続要求処理は、CPU使用料や応答時間におけるコストが高い
  - アイドル状態のコネクションは、メモリリソースを無駄に消費する

😸 開発者とDBAの視点それぞれで考えるべきこと

  - 開発者・設計者
    - 接続頻度や保持するコネクション数は適切か?コネクションプーリングは使用可能か?

  - DBA
    - どのようなアプリケーションからどのような接続形態で使用されるのか?

🐠 コネクションプーリングの接続プロセス

Oracleの場合は、コネクションプールの管理モジュールがコネクションの管理と割り当てを担当する。

アプリケーション・プロセス x3 <- 獲得・返却="" -=""> コネクションプールの管理モジュール <- コネクションの生成・切断="" -=""> DB

🚕 コネクションプーリングの構成要素

  - 物理接続数のコントロール
    - DB内部の実装によって変わる

  - 最小物理接続数までの接続
    - 一気に取得するタイプ、段階的に取得するタイプ
  - 最小物理接続数 -> 最大物理接続数
    - 要求があればで取得するタイプ、先回りして取得するタイプ

  - 最大物理接続数を超える要求
    - 積極型、我慢型、厳密型

😼 アイドル接続の奪取と切断

メンテナーンススレッドは、一定時間使用されていない物理接続を切断するためのしくみ。
これによって、使われていないスレッドが生き残り続けるのを避ける。

😀 障害時の挙動

コネクションプーリングには、障害を検知するためのSQL文を設定できる。
設定できるタイミングは『論理接続獲得時、論理接続返却時、アイドル時に一定間隔』の3つ。
プロセス障害の可能性を意識して、楽観型のしくみにするとよい。

🏀 あとがき

ちょっとわかっていない部分が多いので、もしコネクションプーリング
を理解する上で、お勧めの資料とかあればぜひ教えてください^^

🏈 参考リンク

コネクションプーリングとは 【 connection pooling 】 〔 コネクションプール 〕 - 意味/解説/説明/定義 : IT用語辞典

コネクションプーリングの話 - naoyaのはてなダイアリー

門外不出のOracle現場ワザ 第5章

RDBMSのコネクションプーリングとかその辺の話 - wyukawa’s blog

RDBMSでコネクションプールが必要な理由、わからない。 - Togetterまとめ

📚 おすすめの書籍