たぶんPHPの技術者の中では当たり前のことかもしれない。
自分の技術・知識不足を露呈するエントリーかもしれないけど、きっと知らない人もいるはずなのでメモをかねてエントリー。
PHPを使っていて「MySQLの接続が遅い」と感じたことがないので、あまり意識したことはないんだけど、
心のどこかに「コネクションプールしたほうが良いよな」ってのがずっとあって、調べてみた。
自分のサイトもフォートラベルも、
本とか、その辺の解説サイトに書いてあるように普通につないでいた。
$db = DB::connect($dsn);
って感じで。
コネクションプールするには、
$options=array('persistent'=>true);
$db = DB::connect($dsn, $options);
とか
$options=array('persistent'=>true);
$mdb2 =& MDB2::connect($dsn, $options);
で簡単にできるんだね。。
こんなに簡単だとは思ってなかった。。
ただ、いきなり導入すると、Max Connectionになったりするかも、
apacheのプロセスにあわせて、MySQLの接続数を増やさないといけないので注意を。
あ、
MDB2::singleton
とかもあるんだ。知らなかった。
この記事へのトラックバックURL
http://trackback.blogsys.jp/livedoor/nyamaji/51303094
コネクションプールは PHP+MySQLでは メリット薄いというよりデメリットが大きいかもね。
書いてある通りで MySQLはコネクションのオーバーヘッドが小さいので 毎回接続させても問題ないし。
あと やはり書いてる通りで ApacheのMaxClient以上に MySQLの同時接続数分だけ MySQLの同時接続数を増やさないといけない。
書いたらそれだけなんだけど、MySQLは同時実行数が増えるとパフォーマンスが大きく低下するし 接続数分だけメモリの割り当ても増えてしまう。それよりも接続数を減らして 本体に大きいメモリを割り当てたほうがよいと思う。
コネクションプーリングは Tomcat+Oracleとか 接続数の割にはメモリを食わなくて なおかつwebとアプリケーションサーバが別れている(無駄に接続数が増えない)構造のが向いてるかもなぁ。
厳密に言えば永続接続とコネクションプーリングはイコールでは無いと考えています。PHPの永続接続だけでは接続するWEBサーバの台数が増えたときにケアすべきポイントが増えてしまうのでデメリットが大きいと思います。
とはいえMySQL+PHPの組み合わせでは有効なコネクションプールの仕組みが無いのも事実。SQL Relayというソフトウエアもあるけどパフォーマンスがよろしくないのが痛いところですね。