Class::DBI の内部キャッシュをクリアするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/35480

  •  09-06-2019
  •  | 
  •  

質問

現在、既存のデータベース構造に対する 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回くらいです。

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

役に立ちましたか?

解決

よくある問題」ページ クラス::DBI ウィキ があります セクション この教科では。最も簡単な解決策は、以下を使用してライブ オブジェクト インデックスを完全に無効にすることです。

$Class::DBI::Weaken_Is_Available = 0;

他のヒント

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

これを行う場合:

Music::Artist->purge_object_index_every(2000);

2000 回のオブジェクトがロードされるたびにオブジェクト キャッシュを検査し、メモリ使用量を節約するために無効な参照を削除するように指示しています。それはあなたが望んでいることではないと思います。

さらに、

Music::DBI->clear_object_index();

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

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

お役に立てれば!

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

Class::DBI は非推奨であるため、コードを次の場所に移植する必要があることに注意してください。 DBIx::クラス その代わり。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top