Doctrine 查询缓存和更新

Posted

技术标签:

【中文标题】Doctrine 查询缓存和更新【英文标题】:Doctrine query cache & update 【发布时间】:2012-10-19 07:33:58 【问题描述】:

Doctrine 2 查询缓存对我来说有点令人惊讶。我有两个更新查询,一一对应:

function upd($user, $passwordHash) 
    $qb = $this->entityManager->createQueryBuilder()
        ->update(UserEntity::__class, 'u')
        ->set('u.password', '?1')
        ->where('u = ?0')
        ->setParameters(array($user, $passwordHash));
    $qb->getQuery()->execute();

我用 2 个不同的值(例如 A、B)更新了密码,但用户是相同的:

upd($user, 'A');
upd($user, 'B');

第一个查询真正更新了数据库行。但是第二个在执行后没有对 DB 进行任何更改。

为了解决这个问题,我找到了一些解决方法:

$qb->getQuery()->useQueryCache(false)->execute();

禁用 QueryCache 后,两个查询都会更改 DB 行。

所以,问题是:为什么学说在第二个 UPDATE 查询中使用第一个查询缓存?为什么教义使用缓存,而它是两个具有不同参数($passwordHash)的查询?

【问题讨论】:

【参考方案1】:

发现问题。这是学说 2 ORM 代码中的一个问题。我的 $user 实体具有继承性,因此更新使用 Doctrine\ORM\Query\Exec\MultiTableUpdateExecutor。在那个执行者中:

//FIXME (URGENT): With query cache the parameter is out of date. Move to execute() stage.

Source.

所以目前唯一的解决方法是禁用多表更新的查询缓存:

$qb->getQuery()->useQueryCache(false)->execute();

我为它创建了new bug。

【讨论】:

自 Doctrine2 ORM 2.3.3 及更高版本以来已修复

以上是关于Doctrine 查询缓存和更新的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony 中防止 Doctrine 的查询缓存

学说 2 和 ORM:如何缓存某个实体的每个查询?

试图理解 Doctrine Criteria() 以及是不是可以缓存

RedisRedis 的缓存使用技巧(商户查询缓存)

RedisRedis 的缓存使用技巧(商户查询缓存)

RedisRedis 的缓存使用技巧(商户查询缓存)