2008-08-29 11 views
2

私は現在、既存のデータベース構造に対してClass :: DBIの大規模な実装を進めており、Class :: DBIからキャッシュをクリアする際に問題が発生しています。これはmod_perl実装であるため、クラスのインスタンスはアクセスされる時間の間にかなり古くなる可能性があります。Class :: DBIの内部キャッシュをクリアするにはどうすればよいですか?

Music::DBI->clear_object_index(); 

そして:私は2つのオプションが見つかったmanページから 私はDESTROYメソッドにclear_object_indexを()を追加するとき

Music::Artist->purge_object_index_every(2000); 

は今、実際には空でない実行するようだが、いキャッシュ。私は手動でデータベースを変更して、リクエストを再実行することができます。それはまだ古いバージョンです。 purge_object_index_everyは、n回の要求ごとにインデックスをクリアすると言います。これを「1」または「0」に設定すると、インデックスをクリアするように見えることがあります。私はその2人のうちの1人が働くことを期待していますが、何らかの理由で毎回それをしません。より多くのように1〜5回。

これを解決するための提案はありますか?

答えて

5

Class::DBI wikiの "common problems"ページには、この件に関してsectionがあります。ページがデータベースを変更することが呼び出されたとき、それは常に明示的にそのオブジェクトをリセットするよう

$Class::DBI::Weaken_Is_Available = 0; 
+0

リンクは現在停止しています。誰でも更新されたリンクを知っていますか? –

0

私は、過去にremove_from_object_index正常に使用しました:最も簡単な解決策は完全に使用して、ライブオブジェクトインデックスを無効にすることです確認ページの一部としてキャッシュします。

2

$ obj-> dbi_commit();未完了の取引がある場合は、あなたが探しているものかもしれません。しかし、これは事実ではありません。破壊時に自動的に処理を続ける傾向があるためです。

あなたが行う場合は、この:あなたはメモリの使用を節約するために、オブジェクト・キャッシュごとに2000のオブジェクトの負荷を調べ、死者の参照を削除するためにそれを言っている

Music::Artist->purge_object_index_every(2000); 

。私はあなたが望むものだとは思わない。

また、

Music::DBI->clear_object_index(); 

は、すべてのオブジェクトがライブオブジェクトインデックスを形成削除。私はこれがどんなに役に立っているか分かりません。実際にディスクにフラッシュしているわけではありません。

あなたのやり方はうまくいくはずですが、SQLや他の場所でINSERTやUPDATEの動作を妨げる問題があるかもしれません。 perldocが示唆しているように、各データベースクエリのエラーチェックをしていますか?おそらく、データベースのエラーログから開始したり、クエリが完了していない理由、または到着したかどうかを調べることができます。

希望すると便利です。

-1

Class :: DBIは推奨されていませんので、代わりにDBIx::Classにコードを移植する必要があります。

関連する問題