在 Symfony 中防止 Doctrine 的查询缓存

Posted

技术标签:

【中文标题】在 Symfony 中防止 Doctrine 的查询缓存【英文标题】:Preventing Doctrine's query cache in Symfony 【发布时间】:2011-02-07 00:44:10 【问题描述】:

在我的 Symfony/Doctrine 应用程序中,我有一个按 RANDOM() 排序的查询。我多次调用相同的方法,但查询的结果似乎正在被缓存。

这是我的相关代码:

$query = $table->createQuery('p')
    ->select('p.*, RANDOM() as rnd')
    ->orderBy('rnd')
    ->limit(1)
    ->useQueryCache(null)
    ->useResultCache(null);
$result = $query->fetchOne();

不幸的是,无论我将null 传递给useQueryCacheuseResultCache,每次都返回相同的记录。我尝试使用false 而不是null,但这也不起作用。最后,我还尝试同时拨打setResultCacheLifeSpan(0)setResultCacheLifeSpan(-1),但都没有任何区别。

任何关于如何防止缓存的见解,因为我希望每次调用此方法时都选择不同的随机行?

编辑:我也尝试调用clearResultCache(),但最终导致错误提示:“结果缓存驱动程序未初始化”。

编辑2:根据要求,这是通过调用$query->getSqlQuery()生成的SQL:

SELECT c.id AS c__id, c.name AS c__name, c.image_url AS c__image_url,
c.level AS c__level, c.created_at AS c__created_at, c.updated_at
AS c__updated_at, RANDOM() AS c__0 FROM cards c ORDER BY c__0 LIMIT 1

【问题讨论】:

嗨,马特,你试过$query->useResultCache(false)吗? 是的,我在问题中提到我尝试使用 false,但这也没有用。 为什么要禁用查询缓存?查询保持不变!您只需要清除结果缓存。也许您正在使用 DBMS 缓存...您可以记录查询以查看是否针对每个请求进行了查询。 @greg0ire - 你说得对,我在这里的目的只是为了证明我尝试过的任何事情都没有奏效。不过,我会检查 DBMS 缓存,也许这就是为什么我每次都看到返回相同的记录。 奇数。您使用的是什么后端 DBMS?从 Doctrine 查询生成的实际 SQL 语句是什么? ($query->getSqlQuery())?如果直接在 DBMS 上运行会发生什么?我正在使用 mysql 做几乎相同的事情,它似乎对我来说很好。 【参考方案1】:

原来我是个白痴。我试图简化我对这个问题的查询,但这样做,我没有抓住真正的原因。我有一个where()andWhere() 调用,条件的组合导致只有一个可能的记录被匹配。感谢大家抽出宝贵的时间回复,抱歉浪费了大家的时间!

【讨论】:

【参考方案2】:

Doctrine 还会缓存您在同一请求/脚本运行中创建的实体。

例如:

$order = new Order();
$order->save();

sleep(10); // Edit this record in de DB in another procces.

$q = new Doctrine_Query();
$result = $q->select()
            ->from('Order o')
            ->where('o.id = '.$order->id);
$order = $result->getFirst();
print_r($order->toArray());

print_r 不会包含您在睡眠期间所做的更改。

以下代码将删除这种内存缓存:

$manager = Doctrine_Manager::getInstance();
$connection = $manager->getCurrentConnection();
$tables = $connection->getTables();
foreach ( $tables as $table ) 
    $table->clear();

PS:添加这个答案是因为我发现这个主题试图解决上述问题。

【讨论】:

这对我真的很有帮助,感谢您的解释。

以上是关于在 Symfony 中防止 Doctrine 的查询缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 2 / Doctrine 中启用 ENUM

如何在 Symfony 中添加 Doctrine 过滤器?

在 symfony 中查找当前 Doctrine 数据库连接设置

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

在 Symfony 中使用 Doctrine 的 DBAL 检索布尔值

Symfony2 - Doctrine - 在实体管理器刷新调用中捕获错误