如何清除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"似乎会清除索引...有时。我希望这两个可以工作,但是由于某种原因,它并非每次都能做到。大约五分之一。
有什么建议可以解决吗?
解决方案
回答
Class :: DBI Wiki上的"常见问题"页面上有关于此主题的部分。最简单的解决方案是完全使用以下方法禁用活动对象索引:
$Class::DBI::Weaken_Is_Available = 0;
回答
过去,我已经成功使用过remove_from_object_index,因此,当调用修改数据库的页面时,它总是在确认页面中明确地重置缓存中的该对象。
回答
$ obj-> dbi_commit();如果我们有未完成的交易,可能就是我们要寻找的东西。但是,这种情况不太可能发生,因为它往往会在销毁时自动完成所有挥之不去的交易。
执行此操作时:
Music::Artist->purge_object_index_every(2000);
我们要告诉它每2000个对象加载一次就检查对象缓存,并删除所有无效引用以节省内存。我认为那根本不是你想要的。
此外,
Music::DBI->clear_object_index();
从活动对象索引中删除所有对象。我完全不知道这会有什么帮助。确实不是将它们刷新到磁盘。
听起来我们尝试执行的操作应该可以按方式正常工作,但是SQL或者其他地方可能存在问题,导致INSERT或者UPDATE无法正常工作。我们是否按照perldoc的建议对每个数据库查询进行错误检查?也许我们可以从那里开始,也可以在数据库错误日志中开始,观察查询以查看为什么未完成或者是否到达查询。
希望这可以帮助!
回答
我应该注意,不赞成使用Class :: DBI,而应将代码移植到DBIx :: Class。