- rokujyouhitoma
- 187518
- 16
- 418
- 68
RDBMSでコネクションプールが必要な理由、わからない。HTTPサーバで秒間数万リクエスト捌けるとかいう話を考えるとTCP/IPのセッションが重いというわけではないだろうし、権限のチェックとか?それこそキャッシュできないのって感じだし、何が重くなる要因なのだろう。
2013-09-04 09:23:11@masa_edw コネクションプールが無い場合、使い終わったコネクションが即解放されない(解放まで多少遅延する)ので実際に使っているコネクションの数より多く存在する。その分メモリを圧迫して効率が悪い。っていう話は聞いたことがあるよ(要出典
2013-09-04 09:27:28@voluntas 現状で必要な状況は理解していますが、なぜそうなるのか理解していないということです。他にもたとえば、bitlyの呼び出しはコネクションプールを使うべきか?なぜ(べき、べきでない)のか?どういう要請でそうなのか?と言う問いに僕は答えられません。
2013-09-04 09:31:22@masa_edw 必要が無いパターンを考えると、リクエスト事に TCP を張る事になります。ということはリクエストで 1 スレッド使うとしたらその分だけスレッドを消費してしまいギャーとなる。というのがまず一つです。
2013-09-04 09:34:00@masa_edw 1つの TCP を使い回すという場合はすべてのリクエストに id を振って、戻りのレスポンスにも id を振り直して貰う必要があります。TCP が戻ってくる順番は「サーバの実装次第」になります。
2013-09-04 09:35:07@masa_edw つまるところコネクションプールは必要というよりは「仕方なく」使ってると言えば仕方なく使っています。さらに「サーバ側が」コネクションに耐えられない可能性も考慮する必要があります。
2013-09-04 09:35:45@masa_edw TCP のクライアントとサーバは動作が全く異なるため、HTTP サーバでコネクションプールを比較してはダメですね。listen して accepter で待つパターンと、connect するだけ、ではそもそも動きが違います。
2013-09-04 09:36:51@shimizukawa 即座に解放されないはあんまり関係ない(reuseaddr 使えば使い回せる)、それよりもそもそも1リクエスト事に張る仕組みだと通常の言語だとうまいこと行かないってのがあるね。
2013-09-04 09:39:11@shimizukawa pymysql + gevent とかだとコネクションプールなしでガンガン大量接続言ってるはず。あれが出来れば入らない場合も、ある。
2013-09-04 09:39:39@shimizukawa ただし大量に張って消すのはまぁ効率は悪いし「DB サーバ側を考慮出来てない」実装になる。張りすぎてDB サーバ落ちたら笑えないし。ということで「サーバのためにも」制限したコネクションプールを使いましょうという話。
2013-09-04 09:41:03@shimizukawa gevent + pymysql だとワーカが 1024 とかちゃんと設定出来る。ワーカー数がプロセスなのか、スレッドなのか、疑似スレッドなのか、でこれまた議論がわかれる。
2013-09-04 09:42:02@shimizukawa @masa_edw SQLAlchemy の例で言えば、トランザクション中以外はプールにコネクションを返します。マルチスレッドなら並列で2つのリクエスト処理しつつ、1つのコネクションを交互に使うといったことも可能です。
2013-09-04 09:44:19@voluntas なるほどー。以前Web+DBとかでも時々コネクションプール要・不要論が掲載されてて、コネクションプールしない方が速い、っていうのもあったけど、大量接続するときの話では無いんだろうな
2013-09-04 09:44:48@shimizukawa @masa_edw プールがないと、1リクエスト中に何度も接続するのは非効率なので、トランザクション中でなくてもコネクションを張りっぱなしにすることが多く、並列するリクエストでシェアできない分同時接続数が増えてしまいます。
2013-09-04 09:46:15@methane それだと、プールが無くても1リクエストで一番最初にコネクション張ってリクエスト終わりで閉じるって話もでてきちゃわないかな。ただし「レシーブブロック前提」な。
2013-09-04 09:48:42