Php Symfony 2二级缓存已启用但未使用?

Php Symfony 2二级缓存已启用但未使用?,php,symfony,caching,doctrine-orm,Php,Symfony,Caching,Doctrine Orm,我有至少有一个相关实体的记录列表。在记录列表上,我显示主列表和来自相关记录的数据,所以若表中有约100条记录,则生成并执行约150条查询:一条用于列表,另一条用于每个相关实体,这并不是什么了不起的事情。它可以很容易地简化为两个查询:一个用于列表,一个用于所有相关实体 正如我所发现的,条令中的二级缓存将非常适合这种情况 因此,我在配置中启用了缓存: doctrine: orm: second_level_cache: enabled: true 并添加到所有实体注释@OR

我有至少有一个相关实体的记录列表。在记录列表上,我显示主列表和来自相关记录的数据,所以若表中有约100条记录,则生成并执行约150条查询:一条用于列表,另一条用于每个相关实体,这并不是什么了不起的事情。它可以很容易地简化为两个查询:一个用于列表,一个用于所有相关实体

正如我所发现的,条令中的二级缓存将非常适合这种情况

因此,我在配置中启用了缓存:

doctrine:
  orm:
    second_level_cache:
      enabled: true
并添加到所有实体注释
@ORM\Cache(usage=“READ\u ONLY”)
。然后,在生成列表之前,我将从两个表中提取所有记录:

$this->getDoctrine()->getRepository('AppBundle:Refuel')->findAll();
$this->getDoctrine()->getRepository('AppBundle:FuelType')->findAll();
正如我所希望的那样,它们将得到缓存,并在实际列表渲染过程中重用,而无需生成约150个查询。但事实并非如此。调试面板显示仍有约150个查询被执行,缓存统计数据如下:

Hits: 0
Misses: 2
Puts: 319
所以我猜实体正在被缓存,但没有被重用。为什么?

我所发现的关于二级缓存的所有内容都与redis相关——我不想使用它——是否需要redis来使用该缓存


遗憾的是,关于如何配置它的文档太少了。

只需扩展@BDS和@Jakub的评论,他们有正确的答案,如果你只做一件事,那就是将查询更改为急切加载(请注意,我们在查询中选择了两种实体类型,以便一次性获取所有记录):

完成后,您可以开始考虑使用二级缓存。为此,需要在配置[\u prod].yml中指定缓存驱动程序:

second_level_cache:
  region_cache_driver:
    type: memcache
  enabled: true
  log_enabled: false
  regions:
    my_region:
      cache_driver: memcache
      lifetime: 3600
然后向可缓存实体添加注释:

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 * @ORM\Cache(usage="NONSTRICT_READ_WRITE", region="my_region")
 */

您必须首先定义一个缓存驱动程序,才能使用Redis/MemeCache。听起来您应该为这个关系设置急加载(而不是延迟加载),或者创建一个存储库方法,使用
连接
一次获取整个数据。如果仍然需要,那么实现缓存。是的,Jakub是对的,这是更好的实践。缓存只是对设计糟糕的查询的修补。
/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 * @ORM\Cache(usage="NONSTRICT_READ_WRITE", region="my_region")
 */