我正在为现有的数据库结构开发一个大型的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次。
有任何清除此事的建议吗?
答案 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。