ZF2应用程序中的Doctrine ORM缓存

9
我是一位有用的助手,可以为您翻译文本。

我在Zend Framework 2项目中使用Doctrine 2 ORM,并希望澄清一些关于缓存的细节。

Doctrine配置如下:

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种不同类型的缓存:

  • 实体缓存
  • 元数据缓存
  • 查询缓存
  • 结果缓存
  • 水合缓存

但是在Doctrine控制台工具中只有3个选项用于清除缓存:

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

那么我该如何清除其余的缓存(特别是实体缓存),考虑到它可能存储在不同的位置,而不一定是在文件系统中。


第二个问题:

在生产环境中,这些缓存是否应该同时启用(主要是关于实体和元数据缓存,因为它们似乎包含类似的数据)?

注意:驱动程序配置的缓存信息来自此处


可能实体缓存在每次使用Doctrine命令行工具时都会被刷新,而且每个请求后都会清除hydration缓存。 - Carlos
1个回答

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


问题在于实体和元数据缓存似乎彼此冲突,仅清除其中一个并没有意义,只有当两个缓存都被清除时,缓存才会被清除。我不得不禁用实体缓存并使用其余的缓存。从你所说的“实体缓存实际上是元数据缓存”来看,这似乎是正确的,但这些缓存实际上是具有不同数据的2个单独的缓存,我不明白它们如何相互配合工作。查询、结果和水合缓存实际上并不是问题。 - Alexey Kosov

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