まとめの限定公開に「リンク限定」が追加されました。URLを伝えてまとめを共有しよう!

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

あとで読むためまとめとく。勝手にメンテしてくれると嬉しい。
プログラミング
71066view 13コメント
64
ハイパーむとう @masa_edw
RDBMSでコネクションプールが必要な理由、わからない。HTTPサーバで秒間数万リクエスト捌けるとかいう話を考えるとTCP/IPのセッションが重いというわけではないだろうし、権限のチェックとか?それこそキャッシュできないのって感じだし、何が重くなる要因なのだろう。
V @voluntas
@masa_edw 逆に不要と思った理由に興味があります。
Takayuki Shimizukawa @shimizukawa
@masa_edw コネクションプールが無い場合、使い終わったコネクションが即解放されない(解放まで多少遅延する)ので実際に使っているコネクションの数より多く存在する。その分メモリを圧迫して効率が悪い。っていう話は聞いたことがあるよ(要出典
ハイパーむとう @masa_edw
@voluntas 現状で必要な状況は理解していますが、なぜそうなるのか理解していないということです。他にもたとえば、bitlyの呼び出しはコネクションプールを使うべきか?なぜ(べき、べきでない)のか?どういう要請でそうなのか?と言う問いに僕は答えられません。
ハイパーむとう @masa_edw
@shimizukawa なんでHTTPサーバでそれが問題にならないんでしょうか?
V @voluntas
@masa_edw サーバとクライアントは別世界というのが、一番簡単な話ですね。
V @voluntas
@masa_edw 必要が無いパターンを考えると、リクエスト事に TCP を張る事になります。ということはリクエストで 1 スレッド使うとしたらその分だけスレッドを消費してしまいギャーとなる。というのがまず一つです。
V @voluntas
@masa_edw 1つの TCP を使い回すという場合はすべてのリクエストに id を振って、戻りのレスポンスにも id を振り直して貰う必要があります。TCP が戻ってくる順番は「サーバの実装次第」になります。
V @voluntas
@masa_edw つまるところコネクションプールは必要というよりは「仕方なく」使ってると言えば仕方なく使っています。さらに「サーバ側が」コネクションに耐えられない可能性も考慮する必要があります。
V @voluntas
@masa_edw TCP のクライアントとサーバは動作が全く異なるため、HTTP サーバでコネクションプールを比較してはダメですね。listen して accepter で待つパターンと、connect するだけ、ではそもそも動きが違います。
V @voluntas
@masa_edw 140 文字って説明するの難しいっすねw いかがでしょうか … つたない説明で恐縮です。
Takayuki Shimizukawa @shimizukawa
Vの解説がわかりやすいので誰か魚拓を
V @voluntas
@shimizukawa 即座に解放されないはあんまり関係ない(reuseaddr 使えば使い回せる)、それよりもそもそも1リクエスト事に張る仕組みだと通常の言語だとうまいこと行かないってのがあるね。
V @voluntas
@shimizukawa pymysql + gevent とかだとコネクションプールなしでガンガン大量接続言ってるはず。あれが出来れば入らない場合も、ある。
V @voluntas
@shimizukawa ただし大量に張って消すのはまぁ効率は悪いし「DB サーバ側を考慮出来てない」実装になる。張りすぎてDB サーバ落ちたら笑えないし。ということで「サーバのためにも」制限したコネクションプールを使いましょうという話。
V @voluntas
@shimizukawa gevent + pymysql だとワーカが 1024 とかちゃんと設定出来る。ワーカー数がプロセスなのか、スレッドなのか、疑似スレッドなのか、でこれまた議論がわかれる。
INADA Naoki @methane
@shimizukawa @masa_edw SQLAlchemy の例で言えば、トランザクション中以外はプールにコネクションを返します。マルチスレッドなら並列で2つのリクエスト処理しつつ、1つのコネクションを交互に使うといったことも可能です。
Takayuki Shimizukawa @shimizukawa
@voluntas なるほどー。以前Web+DBとかでも時々コネクションプール要・不要論が掲載されてて、コネクションプールしない方が速い、っていうのもあったけど、大量接続するときの話では無いんだろうな
Yutaka Matsubara @mopemope
コネクションプールの件、マジかーと思ってみてる
Yutaka Matsubara @mopemope
はー、ドライバ書いたら理解できるのでは??
INADA Naoki @methane
@shimizukawa @masa_edw プールがないと、1リクエスト中に何度も接続するのは非効率なので、トランザクション中でなくてもコネクションを張りっぱなしにすることが多く、並列するリクエストでシェアできない分同時接続数が増えてしまいます。
Yoshi Yamaguchi 🇯🇵 @ymotongpoo
もぺさん見てるとほんとすげえと思うわ
V @voluntas
@methane それだと、プールが無くても1リクエストで一番最初にコネクション張ってリクエスト終わりで閉じるって話もでてきちゃわないかな。ただし「レシーブブロック前提」な。
残りを読む(70)

コメント

SH2 @sh2nd 2013-09-04 11:37:36
Oracle Databaseで新規接続に0.7秒かかる環境を見たことがあります。通信待ちなどではなくCPUを0.7秒使います。MySQLだけ見ているといらないと思うかもしれませんが、コネクションプールなしで大量のOLTPをこなせるRDBMSは少数派です。IBM DB2もMicrosoft SQL ServerもPostgreSQLもダメです。
eternalwind @juns76 2013-09-04 11:44:41
そういうプログラムを書いて、こってり絞られてる新卒を見たことがある。 まあ、その時に怒ってる指導側も「そんなのは当たり前だろ」「DB側は重い」ぐらいの説明しかできてなかったし、なんとなくそういうものだと思い込んでいってるだけなのが一目瞭然だった。この業界、現場にいる人は理論までちゃんと理解して使ってるわけじゃないし 疑問に思ったことを口に出しただけで、きつい口調で叩くツイッター界隈の人の偏狭ぶりも笑える
𝑬𝒍𝒓𝒐𝒚 𝑴𝒄𝒈𝒊𝒓𝒆😱TypeC @condotti 2013-09-04 12:21:44
コネクション張る先がOracleかMySQLかでかなり違いそうですね。夏休みの自由研究ネタだな。
trycatch777 @trycatch777 2013-09-04 13:01:43
いつ設計したシステムか?に依存するに1票。10数年前の、(アベレージな)サーバーの能力が高くなかった頃は、コネクションのオーバーヘッドやコネクションを保持しておくコストをケチるという目的が多かったと思うけど、何でもかんでもコネクションプールを使う実装が多かった記憶があります。
TANAKA Takakiyo @takakiyo 2013-09-04 13:52:26
Java EEサーバーだと,一度作成したPreparedStatementを使い回せる,というのも大きい。コンテナの提供するコネクションプールが,Connectionごとに使用したPreparedStatementをキャッシュして自動的に再使用してくれる。
ぎゃばんぱみゅぱみゅ @ledsun 2013-09-04 14:27:14
SQLServer2005 を相手に ASP.NET のコネクションプール(デフォルトで有効)を切ったら目に見えて遅くなったなぁ。なお、どれくらいの負荷を掛けたかは覚えていない。
Peculiar News JP @digdagzigzagu 2013-09-04 14:29:52
岡崎市立中央図書館事件/librahack事件とかあったしな。コネクションプール以前に解放してなかったらしいが、三菱電機インフォメーションシステムズ (MDIS) は土下座して良いと思う。
uNagi @unagix 2013-09-04 15:34:36
なんとなく高木先生渾身のアニメを貼っておこう http://takagi-hiromitsu.jp/diary/20100829.html#p01
乳牛 @NewGyu 2013-09-04 20:36:04
@kazuho 本筋と関係ないところで恐縮ですがこの文脈で「インピーダンスミスマッチ」は関係ないのでは? 
Inetgate Writer @Inetgate 2013-09-05 00:07:14
ざっとまとめを見て、CICSとかTuxedoっていうOLTP系のツールはあまり使われなくなったのかなあと。
たるたる @heporap 2013-09-05 16:21:36
サーバー構築は門外漢ですが、Webサービスの場合、訪問者(多)-ウェブ鯖(1)-DB鯖(1)という構成なので、「DB鯖にとってのクライアント」はウェブ鯖の1つだけ。DB鯖から見れば実質1対1で何度も接続してるようなものだから、コネクションは繋ぎっぱなしの方が都合がいい。ということではないですかね。
Tsuyoshi CHO @tsuyoshi_cho 2013-09-05 18:35:59
heporap 規模大きくなってくると多(大)-多-多な気がしますが、そこらへんも関係するかな。
ログインして広告を非表示にする
ログインして広告を非表示にする