2012-05-29 96 views
9

比方說,我有一個實體,稱爲Product這種實體被加載每次用戶點擊產品信息頁面。通常我會將對象保存在Zend_Cache(memcache)中一小時,以避免每次請求觸及數據庫,但據我瞭解,由於代理對象,Doctrine2實體無法實現這一點。保存doctrine2實體緩存,以加快頁面加載

所以我的問題是,如何避免從數據庫中爲每個請求加載相同的實體?

[編輯]

我試圖用主義緩存這樣

$categoryService = App_Service_Container::getService('\App\Service\Category'); 
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl(); 
    $apple = $cache->fetch('apple'); 

但我得到以下錯誤

警告:要求(應用程序/實體/ Proxy/_ CG _ /App/Entity/Category.php) [function.require]:無法打開流:沒有這樣的文件或目錄 在/opt/vhosts/app/price/library/Doctrine/Common/ClassLoader.php上 線163

這是同爲Zend的緩存,以及你不能序列化,因爲代理類的實體

回答

3

你有幾種選擇:

  1. 使用原則的built-in result caching
  2. 嘗試通過Zend_Cache將實體粘貼到memcache中。當您將其拉出時,您可能需要將產品合併()回到EM中,以便代理可以被解除引用。如果您獲取 - 加入任何需要顯示產品信息的關聯,並且您只是在讀取內容,則此工作正常。
  3. 根本不要緩存實體。緩存你生成的任何輸出。

編輯:如果你不關心水化開銷,你使用MySQL,你的產品和相關的表不經常變化,您可能希望只依靠MySQL查詢緩存。這是一個相當鈍的對象,但足以提及。

+0

1.爲此,我需要覆蓋庫方法,比如'find','findBy *',對吧? 2.請參閱我的編輯。 – Optimus

0

我覺得這是非常奇怪的,因爲我只是搞砸周圍的這個自己,並沒有與代理對象存儲在數據庫中的任何問題。所以即時猜測你的配置沒有設置爲100%?

如果您發現問題與您的配置,然後非常瞭解什麼timdev說你必須合併對象回EntityManager否則你會有奇怪的錯誤下線。

爲您提供的第四個方案也是檢索數據作爲數組,而不是一個對象,但那麼當然你失去所有連接到模塊的功能可能不完全要你想要的。

0

在我看來,更像是一個配置錯誤。代理沒有被生成,或者代理目錄和名稱空間有問題。

根據您的配置,代理可以自動生成也可以手動生成。您的代理是否確實根據App/Entity/Proxy生成?這確實是正確的目錄?

FYI代理可以通過執行doctrine orm:generate-proxies <dest-dir>

1

可以手動生成,您可能想嘗試實施__sleep__wakeup方法對你的實體類,如學說2有關於實體的序列化/反序列化(這是什麼特殊的要求和限制將它們存儲在Zend_Cache中時會發生)。

0

借用什麼timdev說:學說有內置緩存,你想使用它。

我也想知道你的問題,如果你遇到任何性能問題,或者你是過分渴望優化的受害者。