如何清除Class :: DBI的内部缓存?

时间:2008-08-29 23:56:27

标签: perl class-dbi

我正在为现有的数据库结构开发一个大型的Class :: DBI实现,并且遇到了从Class :: DBI清除缓存的问题。这是一个mod_perl实现,因此类的实例在访问它的时间之间可能相当老。 从手册页中我发现了两个选项:

Music::DBI->clear_object_index();

Music::Artist->purge_object_index_every(2000);

现在,当我将clear_object_index()添加到DESTROY方法时,它似乎运行,但实际上并没有清空缓存。我能够手动更改数据库,重新运行请求,它仍然是旧版本。 purge_object_index_every表示它会在每n个请求中清除索引。将其设置为“1”或“0”,似乎有时会清除索引。我希望这两个中的一个能够工作,但由于某些原因它不会每次都这样做。更像是5次中的1次。

有任何清除此事的建议吗?

4 个答案:

答案 0 :(得分:5)

common problems上的“Class::DBI wiki”页面有关此主题的section。最简单的解决方案是使用以下方法完全禁用活动对象索引:

$Class::DBI::Weaken_Is_Available = 0;

答案 1 :(得分:2)

$ obj-> dbi_commit();如果你有未完成的交易,可能就是你要找的东西。但是,情况并非如此,因为它往往会在销毁时自动完成任何延迟交易。

执行此操作时:

Music::Artist->purge_object_index_every(2000);

您告诉它每2000个对象加载检查对象缓存并删除任何死引用以节省内存使用。我认为这根本不是你想要的。

此外,

Music::DBI->clear_object_index();

从活动对象索引中删除所有对象。我不知道这会有什么帮助;它真的没有把它们冲到磁盘上。

听起来你正在尝试做的事情应该按照你的方式运行得很好,但是你的SQL或其他地方可能存在阻止INSERT或UPDATE工作的问题。您是否正在对perldoc建议的每个数据库查询进行错误检查?也许您可以从那里开始或在数据库错误日志中,查看查询以查看它们未完成的原因或是否到达。

希望这有帮助!

答案 2 :(得分:0)

我以前成功使用了remove_from_object_index,因此当调用修改数据库的页面时,它总是在缓存中显式重置该对象作为确认页面的一部分。

答案 3 :(得分:-1)

我应该注意不推荐使用Class :: DBI,而应该将代码移植到DBIx::Class