我目前正在为现有数据库结构开发 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”,似乎会清除索引......有时。我希望这两者之一能够发挥作用,但由于某种原因,它并不每次都能发挥作用。大约五分之一。

有什么建议可以解决这个问题吗?

有帮助吗?

解决方案

这 ”常见问题“ 页面上 类::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