2

現在、既存のデータベース構造に対する Class::DBI の大規模な実装に取り​​組んでおり、Class::DBI からキャッシュをクリアする際に問題が発生しています。これは mod_perl の実装であるため、クラスのインスタンスは、アクセスされるまでかなり古いものになる可能性があります。man ページから、2 つのオプションを見つけました。

Music::DBI->clear_object_index();

と:

Music::Artist->purge_object_index_every(2000);

ここで、clear_object_index() を DESTROY メソッドに追加すると、実行されているように見えますが、実際にはキャッシュが空になりません。データベースを手動で変更し、リクエストを再実行できますが、まだ古いバージョンのままです。purge_object_index_every は、n 回のリクエストごとにインデックスをクリアすることを示しています。これを「1」または「0」に設定すると、インデックスがクリアされるようです...時々。これらの 2 つのうちの 1 つが機能することを期待していますが、何らかの理由で毎回機能するとは限りません。5回に1回くらい。

これをクリアするための提案はありますか?

4

4 に答える 4

5

Class::DBI wikiの「一般的な問題」ページには、このテーマに関するセクションがあります。最も簡単な解決策は、以下を使用してライブ オブジェクト インデックスを完全に無効にすることです。

$Class::DBI::Weaken_Is_Available = 0;
于 2008-08-30T00:54:08.477 に答える
2

$obj->dbi_commit(); 未完了のトランザクションがある場合に探しているものかもしれません。ただし、破棄時に残留トランザクションを自動的に完了する傾向があるため、これはあまり当てはまりません。

これを行う場合:

Music::Artist->purge_object_index_every(2000);

2000 のオブジェクトが読み込まれるたびにオブジェクト キャッシュを調べ、無効な参照を削除してメモリの使用を節約するように指示しています。それはあなたが望んでいることではないと思います。

さらに、

Music::DBI->clear_object_index();

ライブ オブジェクト インデックスからすべてのオブジェクトを削除します。これがどのように役立つかはまったくわかりません。実際には、それらをディスクにフラッシュしていません。

あなたがやろうとしていることは、あなたが持っているようにうまくいくはずですが、INSERTまたはUPDATEの動作を妨げているSQLまたは他の場所に問題がある可能性があります. perldoc が示唆するように、データベースクエリごとにエラーチェックを行っていますか? おそらく、そこから、またはデータベース エラー ログから始めて、クエリを監視して、クエリが完了していない理由やクエリが到着したかどうかを確認できます。

お役に立てれば!

于 2008-09-06T16:05:05.980 に答える
0

過去に remove_from_object_index を正常に使用したことがあるので、データベースを変更するページが呼び出されると、確認ページの一部としてキャッシュ内のそのオブジェクトが常に明示的にリセットされます。

于 2008-09-06T15:32:16.743 に答える
-1

Class::DBI は非推奨であり、代わりにコードをDBIx::Classに移植する必要があることに注意してください。

于 2010-01-05T17:47:28.537 に答える