2012-04-07 161 views
6

我有一個存儲庫,我試圖設置結果緩存。我只能在網上找到一個例子來說明如何做到這一點......但是當我在我的一個存儲庫中實現這個例子時,我得到一個錯誤。 我正在使用APC進行緩存,並啓用了查詢緩存以在我的config.yml文件中使用APC。我分配512M到APC及其只能用50M當前(這個23M是這個單失敗的緩存條目)如何在symfony2存儲庫中指定查詢結果緩存?

這裏是倉庫代碼我有:

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getResult(); 
     return $result; 
    } 
} 

,這是執行的時候,我得到以下錯誤

Notice: apc_store() [<a href='function.apc-store'>function.apc-store</a>]: &quot;type&quot; returned as member variable from __sleep() but does not exist in /data/www/ftw2/Symfony/vendor/doctrine-common/lib/Doctrine/Common/Cache/ApcCache.php line 80 

當我看着我的apc.php文件,看看有什麼緩存,我發現與

儲值用戶高速緩存段我的緩存條目

任何人都可以爲我提供一些方向,我哪裏出了問題?

這個實體中有許多列是ManyToOne,我需要禁用這個查詢的延遲加載這個工作嗎?如果是這樣......怎麼樣? 編輯:我啓用渴望負荷加入,取=「急不可耐」我的多對一的映射......沒有蘋果:(

編輯#2:ANSWERED - 工作類代碼(注意,實體類的所有屬性(成就)已更改爲保護)

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getArrayResult(); 
     return $result; 
    } 
} 

回答

3

當學說緩存的實體,它保存了它的序列化狀態。問題是,私有財產(時學說產生)默認的可見性不能被序列化。要解決這個問題,你必須保護你的實體屬性。更多信息:http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html#merging-entities

另一件事是a know issue(最終)在Doctrine 2.2版本中修復,它將在Symfony 2.1中。如果由於某種原因無法升級,緩存關聯的唯一方法是使用getArrayResult而不是填充實體。

+0

謝謝!我更新了使用受保護的屬性,並將getResult()更改爲getArrayResult(),現在它可以正確緩存。 – Chris 2012-07-06 14:51:50

+0

@Chris,你是如何測試結果是否被緩存的? – cbacelar 2014-02-21 20:01:12

+0

@cbacelar - 幾種方法 1)使用查詢調試器,呈現頁面並查看運行了多少個查詢和哪些查詢。你會在這裏看到你的非緩存查詢。刷新頁面,你會看到緩存的查詢沒有執行。 2)檢查緩存中的統計信息(memcached,apc等)以查看緩存中是否有更多數據或更多記錄。 APC有一個很好的界面,你可以安裝它來讓你查看緩存中的每個實體(包括鍵,值和統計) – Chris 2014-02-22 00:05:34