2

我目前正在为现有数据库结构进行 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”,似乎可以清除索引......有时。我希望这两个中的一个可以工作,但由于某种原因,它并不是每次都这样做。更像是五分之一。

有什么建议可以清除这个吗?

4

4 回答 4

5

Class::DBI wiki上的“常见问题”页面有一个关于这个主题的部分。最简单的解决方案是使用以下方法完全禁用活动对象索引:

$Class::DBI::Weaken_Is_Available = 0;
于 2008-08-30T00:54:08.477 回答
2

$obj->dbi_commit(); 如果您有未完成的交易,可能就是您要查找的内容。但是,这种情况不太可能发生,因为它倾向于在销毁时自动完成任何延迟交易。

当你这样做时:

Music::Artist->purge_object_index_every(2000);

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

此外,

Music::DBI->clear_object_index();

从活动对象索引中删除所有对象。我根本不知道这有什么帮助。它并没有将它们刷新到磁盘,真的。

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

希望这可以帮助!

于 2008-09-06T16:05:05.980 回答
0

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

于 2008-09-06T15:32:16.743 回答
-1

我应该注意 Class::DBI 已被弃用,您应该将代码移植到DBIx::Class

于 2010-01-05T17:47:28.537 回答