2017-06-04 50 views
1

我有至少有一個相關實體的記錄列表。在記錄列表中,我顯示相關記錄的主要列表和數據,所以如果表具有〜100條記錄,則原則會生成並執行〜150個查詢:一個用於列表,另一個用於每個相關實體,這不是一件好事。它可以輕鬆簡化爲只有2個查詢:一個用於列表,另一個用於所有相關實體。已啓用Symfony 2二級緩存但未使用?

正如我所發現的,教義中的二級緩存對於這種情況來說是完美的。

所以,我已經啓用緩存配置:

doctrine: 
    orm: 
    second_level_cache: 
     enabled: true 

,並添加到所有實體註釋@ORM\Cache(usage="READ_ONLY")。然後生成列表我之前獲取的所有記錄形成兩個表:

$this->getDoctrine()->getRepository('AppBundle:Refuel')->findAll(); 
$this->getDoctrine()->getRepository('AppBundle:FuelType')->findAll(); 

正如我希望他們會得到緩存和durign實際列表,而不會產生〜150個查詢渲染重用。但事實並非如此。調試面板顯示,仍然有〜150執行查詢和緩存統計信息:

Hits: 0 
Misses: 2 
Puts: 319 

所以我猜實體正在被緩存但不能重用。爲什麼?

我發現的關於二級緩存的所有內容都與redis有關 - 不想使用它 - 需要redis來使用該緩存嗎?

很遺憾,關於如何配置該文檔的文檔太少了。

+0

你必須先定義一個高速緩存驅動器,可以使用Redis/Memecached。 – BDS

+1

聽起來像你應該爲這個關係設置急切的加載(而不是延遲加載),或者創建一個存儲庫方法來使用'join'一次獲取整個數據。然後如果仍然需要實現緩存。 –

+0

Yep Jakub是對的,這是更好的做法。緩存只是針對設計不當的查詢的補丁。 –

回答

1

只是爲了擴展@BDS和@ Jakub的評論,誰有正確的答案,如果您只做了一件事情,那麼應該將您的查詢更改爲急切加載(請注意,我們在查詢中選擇了兩種實體類型所有記錄將一次性提取):

$refuel= $this->m_em 
     ->getRepository('AppBundle:Refuel') 
     ->createQueryBuilder('r') 
     ->select('r,t') 
     ->join('r.fuel_type', 't') 
     ->getQuery() 
     ->getResult(); 

一旦你這樣做了,你可以開始考慮利用二級緩存。對於這一點,你需要在你的配置指定高速緩存驅動器[_prod] .yml:

​​

,然後添加註釋您可緩存的實體:

/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
* @ORM\Cache(usage="NONSTRICT_READ_WRITE", region="my_region") 
*/