2012-06-23 2 views
6
나는 사용자의 새 메시지 (메시징 응용 프로그램)의 수를 검색하는 쿼리 교리 2의 결과 캐시를 사용하고

는 :교리는이 결과는 캐시 무효화

$query->useResultCache(true, 500, 'messaging.nb_new_messages.'.$userId); 

는이 같은이 캐시를 무효화 시도 (내 엔티티 저장소에 있음) :

public function clearNbNewMessagesOfUserCache($userId) { 
    $cacheDriver = $this->getEntityManager()->getConfiguration()->getResultCacheImpl(); 
    $result = $cacheDriver->delete('skepin_messaging.nbNewMessages.'.$userId); 

    if (!$result) { 
     return false; 
    } 

    return $cacheDriver->flushAll(); 
} 

그래서 내 웹 사이트의 각 페이지에서 쓸모없는 검색어를 만들 필요가 없습니다.

내 질문 : 이 좋습니다. 결국 문제가 생길까요?

답변

2

나는 onFlush 후크를 만드는 아이디어를 가지고있었습니다. 삽입, 업데이트 및 삭제를 위해 대기중인 모든 엔티티가 있으므로 엔티티 이름 및 식별자 등에 따라 캐시를 무효화 할 수 있습니다.

아쉽게도 아직 이벤트 리스너는 작성하지 않았지만 확실히 그런 것을 만들 계획입니다 내 프로젝트에.

Here는 onFlush 이벤트의 교리 문서에 대한 링크입니다

편집 : 이벤트를 구현하기에도 쉬운 방법이 있습니다 . 엔티티 클래스에서 @HasLifecycleCallbacks를 주석에 추가 할 수 있으며 @PreUpdate 또는 @PrePersist 주석을 사용하여 함수를 정의 할 수 있습니다. 이 모델이 업데이트되거나 지속될 때마다이 함수가 호출됩니다.

/** 
* @Entity 
* @Table(name="SomeEntity") 
* @HasLifecycleCallbacks 
*/ 
class SomeEntity 
{ 
    ... 

    /** 
    * @PreUpdate 
    * @PrePersist 
    */ 
    public function preUpdate() 
    { 
     // This function is called every time this model gets updated 
     // or a new instance of this model gets persisted 

     // Somethink like this maybe... 
     // I have not yet completely thought through all this. 
     $cache->save(get_class($this) . '#' . $this->getId(), $this); 
    } 
} 

엔티티의 모든 단일 인스턴스를 무효화하는 데 사용할 수 있습니까?

+0

내 질문에 답변하지 않았습니다 ... – Nanocom