我試圖緩存使用Yii框架1.1.12從數據庫中檢索到的一些結果。這是我在做什麼簡而言之:爲什麼CDbCacheDependency的查詢被執行兩次?
public static function getCategories()
{
if (self::$_categories !== null)
return self::$_categories;
print "Getting categories...";
self::$_categories = Yii::app()->cache->get("categoriesList");
if (self::$_categories === false)
{
$sql = "SELECT id, parent_id, name FROM {{category}} WHERE id > 0 AND is_deleted = 0";
$categoriesList = Yii::app()->db->createCommand($sql)->queryAll();
// Doing some work with $categoriesList and obtaining self::$_categories as the result
// ...
$dependency = new CDbCacheDependency("SELECT MAX(update_time) FROM {{category}}");
Yii::app()->cache->set("categoriesList", self::$_categories, 3600, $dependency);
}
return self::$_categories;
}
使用分析工具,我可以看到一切正常。在第一次兩個查詢被執行(每個查詢一次):
SELECT MAX(update_time) FROM arrenda_category
SELECT id, parent_id, name FROM arrenda_category WHERE id > 0 AND is_deleted = 0
在進一步要求只有第一個被執行。
問題是,當我在arrenda_category
表增加update_time
最大值(甚至沒有用我自己編輯的腳本 - 直接從MySQL命令行)和刷新頁面的SELECT MAX(update_time) FROM arrenda_category
查詢計數等於2.進一步刷新只給再次執行一次。有趣的是,如果我清除緩存,我也有一個執行SELECT MAX(...) ...
查詢。
所以我不明白爲什麼查詢緩存依賴類會在條件發生變化時執行兩次。我的代碼或其他任何東西有問題嗎?
P.S.我確信SELECT MAX(update_time) FROM arrenda_category
只能在上述功能中執行。我還看到,每頁請求已達到print "Getting categories..."
一行。
謝謝你的明確解釋。然而,有一點奇怪的是,當我使用Yii :: app() - > db-> cache($ duration,$ dependency) - > createCommand($ sql)時,一次執行條件查詢的機會不會被預見到。 - > queryAll();'。嘗試獲取緩存值時,可能會以某種方式更新CDbCacheDependency的'update_time'的新值。無論如何,你是對的 - 唯一的辦法就是看資料來找到這樣一個機會。 – Ezze