2015-06-04 35 views
9

我在Zend Framework 2项目中使用Doctrine 2 ORM,我想澄清有关缓存的一些细节。ZF2应用中的学说ORM缓存

主义的配置看起来像

return array(
    'doctrine' => array(
     'driver' => array(
      'application_entities' => array(
       'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
       'cache' => 'doctrine_cache_entities', // 1 
       'paths' => array(__DIR__ . '/../src/Application/Entity') 
      ), 
      'orm_default' => array(
       'drivers' => array(
        'Application\Entity' => 'application_entities', 
       ), 
      ), 
     ), 
     'configuration' => array(
      'orm_default' => array(
       'metadata_cache' => 'doctrine_cache_metadata', // 2 
       'query_cache' => 'doctrine_cache_query', // 3 
       'result_cache' => 'doctrine_cache_result', // 4 
       'hydration_cache' => 'doctrine_cache_hydration', // 5 
      ) 
     ), 
    ), 
); 

在这里我们可以看到5种不同类型的缓存:

  • 实体缓存
  • 元数据缓存
  • 查询缓存
  • 结果缓存
  • 水合作用约车

但只有3学说控制台工具选项清除缓存:

  • ORM:清除缓存:元数据清除各种缓存驱动程序的所有元数据缓存。
  • orm:clear-cache:query清除各种缓存驱动程序的所有查询缓存。
  • orm:clear-cache:result清除各种缓存驱动程序的所有结果缓存。

那么我怎么能清除其余的缓存(特别是实体缓存)考虑到它可以存储在不同的地方,不一定在文件系统。


而第二个问题:

如果所有这些缓存在生产中同时使能(这个问题主要是关于实体和元数据高速缓存,因为它们似乎包含类似的数据)?

** NB *驱动程序配置中的chache信息来自here

+0

也许实体缓存刷新每次使用有关实体学说命令行工具时,和水化缓存每个请求后刷新。 – Carlos

回答

1

您所描述的第一个高速缓存(实体缓存)实际上是元数据高速缓存,并允许您覆盖在实体上使用的缓存类型因此您通过运行orm:clear-cache:metadata来清除实体高速缓存。

随着水化缓存,我倾向于说,它是链接到结果缓存。

从文档中,水合高速缓存用于将实体合并回工作单元时,并且给出应该避免的代价有多昂贵,但是如果您要使用水合高速缓存,则直觉暗示通过运行orm:clear-cache:result你可以清除水化缓存。

水化缓存:https://groups.google.com/forum/#!topic/doctrine-user/V4G4rRF7Ls4

企业合并成UofW:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#merging-entities

+0

问题在于实体和元数据高速缓存似乎彼此冲突,仅仅清除其中的一个就没有意义,只有在清除了两个高速缓存时才实际清除高速缓存。我必须禁用实体缓存并使用其余缓存。从你所说的“实体缓存实际上是元数据缓存”来看,它似乎是真实的,但这些缓存实际上是2个独立的具有不同数据的缓存,我不明白它们是如何彼此协作的。查询,结果和水分缓存实际上不是问题。 –