【问题标题】:How can I clear Class::DBI's internal cache?如何清除 Class::DBI 的内部缓存?
【发布时间】:2010-09-07 07:42:36
【问题描述】:

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

对于清除这个有什么建议吗?

【问题讨论】:

    标签: perl class-dbi


    【解决方案1】:

    Class::DBI wiki 上的“common problems”页面上有一个关于此主题的 section。最简单的解决方案是完全禁用活动对象索引:

    $Class::DBI::Weaken_Is_Available = 0;
    

    【讨论】:

      【解决方案2】:

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

      当你这样做时:

      Music::Artist->purge_object_index_every(2000);
      

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

      此外,

      Music::DBI->clear_object_index();
      

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

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

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-10
            • 1970-01-01
            • 2015-03-31
            • 1970-01-01
            • 2017-08-25
            • 1970-01-01
            • 1970-01-01
            • 2017-09-18
            相关资源
            最近更新 更多