原则 1.2:禁用缓存

Posted

技术标签:

【中文标题】原则 1.2:禁用缓存【英文标题】:Doctrine 1.2: Disabling caching 【发布时间】:2011-06-21 09:33:03 【问题描述】:

与this 问题类似,我在教条如何缓存/水合查询结果的关系方面遇到了一些问题。

现在我知道我可以通过调用 refresh/refreshRelated 来解决问题,但是有没有办法/暂时禁用表的水合缓存? 特别是在选择中使用连接时,示例代码变为:

$result2 = Doctrine_Query::create()
           ->leftJoin('s.School sc')
           ->from('Student s')
           ->execute();

您确实希望 Doctrine 使用来自您的连接的数据,而不是使用来自先前选择的缓存水合结果。

有没有办法做到这一点?

提前致谢!

【问题讨论】:

【参考方案1】:

我认为默认情况下它应该与查询结果水合,除非您更改了Doctrine_Core::ATTR_HYDRATE_OVERWRITE。您可以通过以下方式检查该值:

$doctrineManager = Doctrine_Manager::getInstance();
$val = $doctrineManager->getAttribute(Doctrine::ATTR_HYDRATE_OVERWRITE); 

当您调用 refresh() 时,它会将此值强制为 true,并再次执行查询,然后恢复设置。如果你的恰好是假的,你可以用$doctrineManager->setAttribute改变它

【讨论】:

ATTR_HYDRATE_OVERWRITE 是默认开启的,遗憾的是不能解决问题【参考方案2】:

我认为您的 refreshRelated 解决方案还可以,但如果您不需要缓存中的这些项目。你可以设置

Doctrine_Manager::connection()->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true );

这样一来,Doctrine 将在每个查询结束时自动调用 free(),因此它不会缓存其结果,并且还会降低内存占用。

【讨论】:

以上是关于原则 1.2:禁用缓存的主要内容,如果未能解决你的问题,请参考以下文章

缓存击穿问题与缓存设置顺序原则

敏捷1.2敏捷宣言的官方解释:12条敏捷原则

golang--Channel有无缓存区别,以及关闭原则

陈睿:架构设计之数据库拆分六大原则

陈睿:架构设计之数据库拆分六大原则

缓存策略