Unknown::Programming このページをアンテナに追加 RSSフィード

2011-12-18 不逞

MDB2で複数のDB接続を行う場合の恐ろしい罠

MDB2を使って複数のDB接続したいなんてことあるよね。

ところがどっこい、実際にコードを書いてみると恐ろしいことが起きた。それは二つ目のDB接続をすると一つ目のDB接続が二つ目のDB接続に乗っ取られてしまうという!

<?php
// fooというデータベースへ接続し、hoge_tblのカウントする
$dbh = MDB2::factory('mysql://user:pass@localhost/foo?charset=utf8');
$res = $dbh->query('SELECT COUNT(*) FROM hoge_tbl');
$row = $res->fetchRow();
$res->free();
print $row[0]; // 5件

// で次にbarへ接続し同様の処理
$dbh2 = MDB2::factory('mysql://user:pass@localhost/bar?charset=utf8');
$res = $dbh2->query('SELECT COUNT(*) FROM hoge_tbl');
$row = $res->fetchRow();
$res->free();
print $row[0]; // 2件

// そして、fooに接続してるDBハンドルでもういちどカウントしてみると・・・
$res = $dbh->query('SELECT COUNT(*) FROM hoge_tbl');
$row = $res->fetchRow();
$res->free();
print $row[0]; // 2件

このコードが5、2、2と表示されるわけです。なんでこんなことに・・・、と思って色々調べてみると、どうやら同一ホストへの接続の場合、いろいろキャッシュ的な感じでごにょごにょむにょむにょして同一の接続扱いになってしまうようです。

でまぁ原因はわかったけど、じゃあどうやって複数接続すればいいんだよ!ということで、これを明示的に別の接続として扱うためのnew_linkってオプションを発見。

<?php
// new_link=trueをつけましょう!
$dbh2 = MDB2::factory('mysql://user:pass@localhost/bar?charset=utf8&new_link=true');

こうすることで二つ目のDB接続は新しい接続だよ!と明示され、晴れて同一の接続じゃなくなりました。

いやぁnew_linkなんていう便利なオプションがあるんですね() # デフォでtrueにしとけよ!って感じですが。

ということで今頃気付いたのかよって思う人もいるかもしれませんが、知らなかった人はもしかしたら気付かない間に別のDBに接続されててバグだらけになってた、なんてことになってるかもしれないのでご愁傷様です。

icpa0icpa0 2012/04/06 15:37 はじめまして、ICPAの中原でございます。
突然のメールで失礼致します。ブログを拝見させて頂いてメールさせて頂いております。
私どもは外資系ヘッドハンティングファームでございます。外資系IT企業、コンサルティングファーム、国内IT企業のエンジニアポジションをご紹介しております。
現在、クライアント(自社サービスを持った企業)の強いご希望でスマートフォン向けアプリエンジニア、アプリケーションエンジニア、サーバー、DB周りのエンジニアを急務で探しておりまします。
管理人様が上記PHPでプログラミングが出来るエンジニアかと思い非常に興味を持っております。
もし、転職したい、作るプロダクトを変えたい、新しい技術を職場で学びたいという希望があれば、是非ご連絡ください。
何卒、よろしくお願いします。
E-mail nakahara@icpa.com

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fbis/20111218/1324215830