为什么doctrine 2会在重复查询中转到DB?

时间:2015-12-05 18:51:41

标签: php mysql symfony doctrine-orm doctrine

当我做的时候

$objectRepository = $objectManager->getRepository(MyEntity::class);
$myEntity = $objectRepository->findOneBy(["some_attribute" => $someValue]);
$myEntity = $objectRepository->findOneBy(["some_attribute" => $someValue]);

Doctrine正在执行2个查询而不只是1:

151205 19:32:58  1265 Query SELECT ... WHERE t0.some_attribute = 'some_value' LIMIT 1
151205 19:32:59  1265 Query SELECT ... WHERE t0.some_attribute = 'some_value' LIMIT 1

我想避免使用缓存进行重复查询,我对其进行了配置:

doctrine:
    dbal:
       ...
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        metadata_cache_driver: array

        result_cache_driver: array
        query_cache_driver: array
        second_level_cache:
            enabled: true
            log_enabled: true
            region_cache_driver: array

使用array缓存,因为我只想避免在同一请求中重复查询。

但它不起作用,Doctrine仍在执行重复查询而不是使用缓存......

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:0)

这是因为默认情况下doctrine未设置为缓存内容。要使您的查询被缓存,您需要手动设置它:

$entity = $objectRepository
    ->createQueryBuilder('a')
    ->where(...)
    ->getQuery()
    ->useQueryCache(true) //setting query to be cached
    ->useResultCache(true) //setting result to be cached
    ->getOneOrNullResult();

要默认设置doctrine缓存内容,请检查this问题 还要确保您处于有效环境中(缓存通常仅在production env中启用)