代码之家  ›  专栏  ›  技术社区  ›  Jack M.

如何清除Class::DBI的内部缓存?

  •  2
  • Jack M.  · 技术社区  · 16 年前

    我目前正在为现有数据库结构开发Class::DBI的大型实现,并且在清除Class::DBI中的缓存时遇到了问题。这是一个mod_perl实现,因此一个类的实例在被访问期间可能非常旧。

    Music::DBI->clear_object_index();
    

    以及:

    Music::Artist->purge_object_index_every(2000);
    

    现在,当我将clear\u object\u index()添加到DESTROY方法时,它似乎在运行,但实际上并没有清空缓存。我可以手动更改数据库,重新运行请求,但它仍然是旧版本。 purge_object_index_every表示它每n个请求清除一次索引。将其设置为“1”或“0”,似乎可以清除索引。。。有时我希望这两个中的一个能起作用,但由于某些原因,它并不是每次都能起作用。更像是五分之一。

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   John Siracusa    16 年前

    " common problems Class::DBI wiki 有一个 section 关于这个问题。最简单的解决方案是完全禁用活动对象索引,方法是:

    $Class::DBI::Weaken_Is_Available = 0;
    
        2
  •  2
  •   Hynek -Pichi- Vychodil    16 年前

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

    Music::Artist->purge_object_index_every(2000);
    

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

    此外

    Music::DBI->clear_object_index();
    

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

    希望这有帮助!

        3
  •  0
  •   zigdon    16 年前

        4
  •  -1
  •   Shlomi Fish    15 年前
    推荐文章