Caching 预防主义';Symfony中的s查询缓存

Caching 预防主义';Symfony中的s查询缓存,caching,symfony1,doctrine,symfony-1.4,doctrine-1.2,Caching,Symfony1,Doctrine,Symfony 1.4,Doctrine 1.2,在我的Symfony/Doctrine应用程序中,我有一个按RANDOM()排序的查询。我多次调用同一个方法,但它看起来像是缓存了查询的结果 这是我的相关代码: $query = $table->createQuery('p') ->select('p.*, RANDOM() as rnd') ->orderBy('rnd') ->limit(1) ->useQueryCache(null) ->useResultCac

在我的Symfony/Doctrine应用程序中,我有一个按RANDOM()排序的查询。我多次调用同一个方法,但它看起来像是缓存了查询的结果

这是我的相关代码:

$query = $table->createQuery('p')
    ->select('p.*, RANDOM() as rnd')
    ->orderBy('rnd')
    ->limit(1)
    ->useQueryCache(null)
    ->useResultCache(null);
$result = $query->fetchOne();
不幸的是,无论我将
null
传递给
useQueryCache
useResultCache
,每次都返回相同的记录。我尝试使用
false
而不是
null
,但也不起作用。最后,我还尝试调用
setResultCacheLifeSpan(0)
setResultCacheLifeSpan(-1)
,但这两个调用都没有效果

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

Edit:我还尝试调用
clearResultCache()
,但这只会导致一个错误:“结果缓存驱动程序未初始化”

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


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

条令还缓存在同一请求/脚本运行中创建的实体

例如:

$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());
打印将不包含您在睡眠期间所做的更改

以下代码将删除此类内存缓存:

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

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

嗨,Matt,您是否尝试过
$query->useResultCache(false)
?是的,我在问题中提到,我尝试过使用false,但也不起作用。为什么禁用查询缓存?查询保持不变!您只需要清除结果缓存。可能您正在使用DBMS缓存。。。您可以记录查询,以查看是否对每个请求进行了查询。@greg0ire-您是对的,我在这里的目的只是为了证明我所尝试的一切都不起作用。不过,我会检查DBMS缓存,也许这就是为什么每次都返回相同的记录。奇怪。您正在使用什么后端DBMS?从条令查询生成的实际SQL语句是什么?($query->getSqlQuery())?如果直接在DBMS上运行,会发生什么?我正在使用MySQL做几乎相同的事情,它似乎对我很好。这对我很有帮助,谢谢你的解释。
$manager = Doctrine_Manager::getInstance();
$connection = $manager->getCurrentConnection();
$tables = $connection->getTables();
foreach ( $tables as $table ) {
    $table->clear();
}