2016-05-18 15 views
2

Redisを使用して、自分のエンティティに第2レベルのREAD_WRITEキャッシュを設定しました。Doctrine:第2レベルのキャッシュ

新しいエンティティを挿入するとキャッシュがクエリに対して無効にならない理由は、エンティティを更新または削除すると無効になります。例えば。この場合

$this 
    ->getDoctrine() 
    ->getManager() 
    ->getRepository('AppBundle:Test') 
    ->createQueryBuilder('s') 
    ->select('s') 
    ->getQuery() 
    ->setCacheable(true) 
    ->getResult(); // this is my query. 

それはキャッシュを無効にします。

$a = $this 
    ->getDoctrine() 
    ->getManager() 
    ->getRepository("AppBundle:Test") 
    ->find(119); 
$a->setName("new value"); 
$a->setType("new value"); 

しかし、この場合にはそれが間違って何

$a = new Test(); 
$a->setName('fg'); 
$a->setType('bbbb'); 

$this->getDoctrine()->getManager()->persist($a); 
$this->getDoctrine()->getManager()->flush(); 

を無効にしたくないのですか?

答えて

0

2番目のクエリは、特定のIDを持つ特定のエンティティの検索です。 Doctrineを使ってエンティティを更新/削除するときには、キャッシュに何かが存在する可能性がある(エンティティ自身で設定したため)可能性があります(おそらくpostFlushリスナーを使用して)。

したがって、Doctrineは2番目のケースでキャッシュの無効化を管理しています。

最初のクエリでは、キャッシュは選択時にQueryBuilder上でのみ設定されるため、Doctrineは更新/削除時にキャッシュについて認識しません。 おそらくあなた自身のキャッシュ無効化プログラム(おそらく、doctrineなどのpostFlushリスナー)を書く必要があります。 キーに基づいて無効化を許可するには、setResultCacheIdに電話して、後で無効にするために必要な特定のキーを使用することができます。

関連する問題