2011-03-02 83 views
3

在我的symfony項目,我有一個「複雜」的查詢,看起來像:內存緩存使用的Symfony /原則重新加載數據

$d = Doctrine_Core::getTable('MAIN_TABLE') 
    // Create the base query with some keywords 
->luceneSearch($keywords) 
->innerJoin('w.T1 ws') 
->innerJoin('ws.T2 s') 
    ->innerJoin('w.T3 piv') 
->innerJoin('piv.T4 per') 
->innerJoin('w.T5 st') 
    ... 
->innerJoin('doc.T12 docT') 
->innerJoin('w.Lang lng') 
->execute(); 

我將所有這些innerJoin減少查詢次數由於我的數據模型。實際上所有的數據都通過這個查詢來恢復......但是查詢需要2到20秒。取決於關鍵字。

我決定使用memcache,因爲數據不會一直在改變。

我所做的是配置內存緩存和添加

... 
->useResultCache(true) 
->execute(); 

到我的查詢。

什麼奇怪的是:

  • 第一次(當緩存爲空/刷新),只有一個查詢是執行
  • 第二次,〜130頃執行,它需要更多的時間比第一個...

這些「新」查詢檢索數據從「內部聯接」爲每個記錄。

我不明白爲什麼「innerjoined」數據沒有保存在緩存中?

我試圖改變水合物模式,但它似乎沒有影響。

有人有想法嗎?

+0

您應該將解決方案遷移到一個答案。然後你可以接受你自己的答案。這是合法的。 – 2011-03-16 13:09:05

回答

1

經過一整天的googlise,分析學說和變得絕望,我發現了一篇文章,解釋瞭解決方案:

class User extends BaseUser{ 
    public function serializeReferences($bool=null) 
    { 
     return true; 
    } 
} 

的問題是在配置文件對象沒有得到存儲在結果緩存並因此在每次從用戶對象調用它時引起查詢。經過多次狩獵,在#doctrine很長一段時間,以及幾個人的幾條線索,事實證明,默認情況下,Doctrine只會將直接關係序列化爲主要對象。但是,您可以通過覆蓋函數serializeReferences在要從中序列化引用的類中返回true來使其序列化進一步向下的對象。在我的例子中,這是User類。由於我們的應用程序將永遠只需要在「用戶」類的結果高速緩存進行序列化我完全推翻的功能,並使其始終返回true

http://shout.setfive.com/2010/04/28/using-doctrine-result-cache-with-two-deep-relations/