2005年08月17日

先週末に、Apache2+mod_perlな環境で新しいサイト作ってたのです。
せっかくだから、今まで触ったことの無いClass::DBI使おうと思って0.96入れたわけですよ。0.96。
そしたらなんかupdateしたレコードの値が変わらないんです。もうお前ら150円やる宇和なにうぃげfせrtfぎゅひじょkpl
今までは独自にO/Rマッピングしてたんだけど、たまには一般的なのでも使ってみようということで使い出したです。

そのサイトは、Webアプリ側はとあるテーブルのカウント数値を元にしてソートをかけてランキング表示をして、バックエンドでカウントの数値を更新しています。
しばらく動かしていたら、ソート結果は意図したとおりだけど、表示されるカウント数値が更新されなくなりました。
なんとなくデータキャッシュされてそうだなぁと思いClass::DBI.pmやらIma::DBI.pmのソースを調べて

Data::Table->search_hoge()->{_data};

なコードでキャッシュされていないデータを取得できる事を発見して、汚らしいけどこれでしのいだ。
めんどくさいから追求しなかったの。

そしてついさっき
のみまくし日記 - Class-DBI-0.96(1792) - TokuLog!


で、原因は判明。
Class::DBI の Version 0.96 以後では、オブジェクトの生成にキャッシュが効くのが原因でした。
Primary Key が同じオブジェクトは、キャッシュされるのです。

やっぱりキャッシュ機構が入っていたのね。
$Class::DBI::Weaken_Is_Available = 0;

を書いておけばキャッシュ機構がOFFになるみたい。

しっかし、クエリを投げてデータも取ってきてるのにキャッシュしてるのかな。。。変な実装。。。
apache2+mod_perlな環境だけなのか何なのかも謎
同じプロセス内ではキャッシュが生き続ける感じなのかしら。

てか、一年前からの既出ネタの可能性大なのか。。。ぐぐっても対処法わからんかったorz
MFPM::Class::DBI

Posted by Yappo at 2005年08月17日 21:15 | TrackBack | Perl
Comments

こんにちは。
http://www.lost-season.jp/pm/Class/DBI/Plugin/NoCache.html
拙作ですが、同じ解決法($Class::DBI::Weaken_Is_Availableの操作)
によるモジュールです。

clear_object_indexを呼ぶのもアリかもしれませんが面倒かも。

確認してないのですが、Class::DBI::Sweetは
キャッシュ関係の処理がかなり変更されているようなので、試してみるといいかもです。

Posted by: kato at 2005年08月18日 04:49

なるほど、Class::DBI->_initを直接書き換えちゃう形の実装なのですね。
参考にします~

Posted by: Yappo at 2005年08月18日 20:34
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。