2015-06-04 61 views
9

我在Zend Framework 2項目中使用Doctrine 2 ORM,我想澄清有關緩存的一些細節。ZF2應用中的學說ORM緩存

主義的配置看起來像

return array(
    'doctrine' => array(
     'driver' => array(
      'application_entities' => array(
       'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
       'cache' => 'doctrine_cache_entities', // 1 
       'paths' => array(__DIR__ . '/../src/Application/Entity') 
      ), 
      'orm_default' => array(
       'drivers' => array(
        'Application\Entity' => 'application_entities', 
       ), 
      ), 
     ), 
     'configuration' => array(
      'orm_default' => array(
       'metadata_cache' => 'doctrine_cache_metadata', // 2 
       'query_cache' => 'doctrine_cache_query', // 3 
       'result_cache' => 'doctrine_cache_result', // 4 
       'hydration_cache' => 'doctrine_cache_hydration', // 5 
      ) 
     ), 
    ), 
); 

在這裏我們可以看到5種不同類型的緩存:

  • 實體緩存
  • 元數據緩存
  • 查詢緩存
  • 結果緩存
  • 水合作用約車

但只有3學說控制檯工具選項清除緩存:

  • ORM:清除緩存:元數據清除各種緩存驅動程序的所有元數據緩存。
  • orm:clear-cache:query清除各種緩存驅動程序的所有查詢緩存。
  • orm:clear-cache:result清除各種緩存驅動程序的所有結果緩存。

那麼我怎麼能清除其餘的緩存(特別是實體緩存)考慮到它可以存儲在不同的地方,不一定在文件系統。


而第二個問題:

如果所有這些緩存在生產中同時使能(這個問題主要是關於實體和元數據高速緩存,因爲它們似乎包含類似的數據)?

** NB *驅動程序配置中的chache信息來自here

+0

也許實體緩存刷新每次使用有關實體學說命令行工具時,和水化緩存每個請求後刷新。 – Carlos

回答

1

您所描述的第一個高速緩存(實體緩存)實際上是元數據高速緩存,並允許您覆蓋在實體上使用的緩存類型因此您通過運行orm:clear-cache:metadata來清除實體高速緩存。

隨着水化緩存,我傾向於說,它是鏈接到結果緩存。

從文檔中,水合高速緩存用於將實體合併回工作單元時,並且給出應該避免的代價有多昂貴,但是如果您要使用水合高速緩存,則直覺暗示通過運行orm:clear-cache:result你可以清除水化緩存。

水化緩存:https://groups.google.com/forum/#!topic/doctrine-user/V4G4rRF7Ls4

企業合併成UofW:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#merging-entities

+0

問題在於實體和元數據高速緩存似乎彼此衝突,僅僅清除其中的一個就沒有意義,只有在清除了兩個高速緩存時才實際清除高速緩存。我必須禁用實體緩存並使用其餘緩存。從你所說的「實體緩存實際上是元數據緩存」來看,它似乎是真實的,但這些緩存實際上是2個獨立的具有不同數據的緩存,我不明白它們是如何彼此協作的。查詢,結果和水分緩存實際上不是問題。 –