有关缓存db查询的CActiveDataProvider的奇怪行为

时间:2014-03-15 09:29:55

标签: php mysql caching yii

我知道pagination false CActiveDataProvider时,$dependency = new CDbCacheDependency('SELECT MAX(id) FROM user'); $dataProvider = new CActiveDataProvider(User::model()->cache(20, $dependency), array('pagination'=>false)); 使用单个查询。 所以我写了这段代码:

SELECT MAX(id) FROM user

缓存数据时,执行此单个查询:

SELECT * FROM `user` `t`
SELECT MAX(id) FROM user

20秒后,缓存被刷新,因此查询:

User

另外,如果我在SELECT * FROM `user` `t` SELECT MAX(id) FROM user 表中插入一条记录,因为它是依赖的,所以执行了这些查询:

$dependency = new CDbCacheDependency('SELECT MAX(id) FROM user');
$dataProvider = new CActiveDataProvider(User::model()->cache(20, $dependency, 2));

这一切似乎都没问题,没问题。

现在我尝试使用此示例查询进行另一项测试:

CActiveDataProvider

我知道上面的代码SELECT MAX(id) FROM user SELECT MAX(id) FROM user 使用了两个查询。

缓存数据时,执行以下查询:

SELECT COUNT(*) FROM `user` `t`
SELECT MAX(id) FROM user
SELECT * FROM `user` `t` LIMIT 10
SELECT MAX(id) FROM user

太奇怪了! (为什么?!)

20秒后,缓存刷新,我看到执行了这些查询:

SELECT MAX(id) FROM user
SELECT COUNT(*) FROM `user` `t`
SELECT MAX(id) FROM user
SELECT MAX(id) FROM user
SELECT * FROM `user` `t` LIMIT 10
SELECT MAX(id) FROM user

现在,我在这里有4个查询!!!

最后我在表中插入一条记录,因为依赖项必须刷新缓存,但我在这里看到6条查询(而不是4条查询)!!!

{{1}}

这种行为很奇怪! (为什么?!)

我认为这是一个错误。

由于

2 个答案:

答案 0 :(得分:0)

Salam hamvatan, 我有这个问题,非常搜索。我知道如果$ duration或$ dependency中的哪一个过期,缓存也会过期。 我的代码示例:

$dependency->sql = 'SELECT MAX(create_date),MAX(update_date),count(id) FROM game where status=:NOT_DONE';
$dependency->params = array(':NOT_DONE'=>Game::NOT_DONE);   
$games = new CActiveDataProvider(Game::model()->cache(3600*24*30,$dependency,1));
  

我知道当分页错误时,CActiveDataProvider会使用单个   查询。

这句话对我有所帮助,谢谢。我在寻找这个。

http://www.yiiframework.com/doc/api/1.1/CDbConnection#queryCachingDuration-detail

答案 1 :(得分:-1)

如果您使用renderPartial渲染视图,则应将$ processOutput参数设置为true以避免多次ajax调用。