Doctrine缓存基础知识

3
我不理解Doctrine缓存设置的默认行为和基本含义。
  1. If I issue a basic query (with the default symfony & doctrine configuration) like

    $em->getRepository(MyEntity::class)->findAll()
    

    is this cached in any way???

    1.1 What about $queryBuilder->...->getResult()? without touching ->useXXXCache(), is this cached?

    1.2 So, do I understand correctly that caching only is enabled via $queryBuilder->...->useXXXCache()->getResult() ?

  2. Per default, all 3 caches (metadata, query and result) are set to array. This means, each new request has it's own cache.

    Ok, so if I use this setting, and do not perform any flushes and persists during a request that uses cached queries, then I can be sure that I will never get outdated results ? Because writes take place in an other request.

  3. Is there a possibility to use a cache (result or query) by default? So to not having to set $query->useResultCache(true)?


这个答案有帮助吗?如果不是,请您评论并指出不清楚的地方。否则,请参考当有人回答我的问题时我该怎么做? - lxg
1个回答

4
如果我发出一个基本查询(使用默认的Symfony和Doctrine配置),比如$em->getRepository(MyEntity::class)->findAll(),这个查询会被缓存吗?
不会被缓存,但是检索到的实体在脚本的生命周期内由实体管理器进行管理。这意味着,如果例如findAll()调用给出ID为1、2、3的实体,然后你随后调用find(1),它不会触发新的数据库查询。
但是,如果你执行一个DQL查询(直接或通过查询构建器),它将始终触发一个数据库查询,即使结果集相同。至少已经管理的实体不需要再进行水合作用。
1.1 $queryBuilder->...->getResult()怎么样?在没有触及->useXXXCache()的情况下,这个查询是否被缓存?
不会。
1.2 那么,我是否正确地理解了只有通过$queryBuilder->...->useXXXCache()->getResult()才启用缓存?
是的。
默认情况下,所有三个缓存(元数据、查询和结果)都设置为数组。这意味着,每个新请求都有自己的缓存。
是的。你可以轻松地设置不同的缓存,例如APCu、Redis或Memcache。然而,建议只在生产环境中使用它们。
好的,所以如果我使用这个设置,并且在使用缓存查询的请求期间不执行任何刷新和持续操作,那么我可以确定我永远不会得到过时的结果吗?因为写操作发生在另一个请求中。
如果你担心并发请求会弄乱你的数据,请使用事务和锁定。
有没有可能默认使用缓存(结果或查询)?所以不必设置$query->useResultCache(true)
没有。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接