酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

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つ。 プロセス障害の可能性を意識して、楽観型の仕組みにするとよい。

あとがき

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

Special Thanks

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

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

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

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

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

おすすめの書籍