Perl 如何清除Class::DBI';什么是内部缓存?
我目前正在为现有数据库结构开发Class::DBI的大型实现,并且在清除Class::DBI中的缓存时遇到了问题。这是一个mod_perl实现,因此一个类的实例在被访问期间可能非常旧。 从手册页中,我找到了两个选项:Perl 如何清除Class::DBI';什么是内部缓存?,perl,class-dbi,Perl,Class Dbi,我目前正在为现有数据库结构开发Class::DBI的大型实现,并且在清除Class::DBI中的缓存时遇到了问题。这是一个mod_perl实现,因此一个类的实例在被访问期间可能非常旧。 从手册页中,我找到了两个选项: Music::DBI->clear_object_index(); 以及: 现在,当我将clear\u object\u index()添加到DESTROY方法时,它似乎在运行,但实际上并没有清空缓存。我可以手动更改数据库,重新运行请求,但它仍然是旧版本。 purge_ob
Music::DBI->clear_object_index();
以及:
现在,当我将clear\u object\u index()添加到DESTROY方法时,它似乎在运行,但实际上并没有清空缓存。我可以手动更改数据库,重新运行请求,但它仍然是旧版本。
purge_object_index_every表示它每n个请求清除一次索引。将其设置为“1”或“0”,似乎可以清除索引。。。有时候。我希望这两个中的一个能起作用,但由于某些原因,它并不是每次都能起作用。更像是五分之一
有没有关于清除此问题的建议?上的“”页对此主题有详细说明。最简单的解决方案是完全禁用活动对象索引,方法是:
$Class::DBI::Weaken_Is_Available = 0;
我过去成功地使用过从对象索引中删除对象,因此当调用修改数据库的页面时,它总是在确认页面中显式重置缓存中的对象。$obj->dbi\u commit();如果您有未完成的交易,则可能是您正在寻找的。然而,这种情况不太可能发生,因为它倾向于在销毁时自动完成任何延迟交易 执行此操作时:
Music::Artist->purge_object_index_every(2000);
您告诉它每加载2000个对象就检查一次对象缓存,并删除所有死引用以节省内存使用。我认为那根本不是你想要的
此外,
Music::DBI->clear_object_index();
从活动对象索引中删除所有对象。我不知道这会有什么帮助;这并不是将它们刷新到磁盘,真的
听起来,您正在尝试的操作应该可以按照您的方式正常工作,但是您的SQL或其他地方可能存在问题,导致插入或更新无法工作。您是否按照perldoc的建议对每个数据库查询进行错误检查?也许您可以从那里或在数据库错误日志中开始,观察查询以了解它们为什么没有完成,或者它们是否曾经到达
希望这有帮助 我应该注意Class::DBI已被弃用,您应该将代码移植到
Music::DBI->clear_object_index();