2012-09-12 1 views
1

나는 Bellow처럼 저장소를 가지고있다.Doctrine2 캐시 손상?

항목이 이미 테이블에 있으면 코드가 먼저 확인합니다.

  • 그렇지 않으면 데이터를 다운로드 한 다음 테이블에 저장합니다.

  • 이미 테이블에 있으면 레코드를 반환합니다.

그러나 때로는 테이블의 항목에 대한 검사 후 여전히 가서 키 충돌을 만들고, 다운로드하고이 이미 경우에도 항목을 저장하기 위해 노력하지만,이 그것 때문에 발생해서는 안됩니다 단지 수색하고 그것을 찾지 못했습니다.

유의할 것들 : 내가 $ 질의 -를 사용하지 않도록 설정하면

  1. > (참) useResultCache 내가 아무 문제가 없습니다.
  2. 테이블에서 작업하는 유일한 프로세스입니다.
  3. 이 코드는 항목이 테이블에 추가되는 유일한 장소입니다.
  4. 이 코드는 symfony2 콘솔 명령에서 호출됩니다.
  5. Memcache는 doctrine2에 설정된 캐시입니다.
  6. Memcached가 로컬로 실행 중입니다.
  7. arraycache를 사용할 때도 오류가 발생합니다.
  8. 이 쿼리는 1 초에 여러 번 실행됩니다. 새 항목을 추가 할 때 결과 캐시를 만료해야 할 수도 있습니다처럼
 
    class ItemRepository extends EntityRepository 
    { 
     public function findOrFetch($id) 
     { 

     $item = $this->findItem($id); 

     if($item != null) 
      return $item; 
     else 
      { 
     $itemData = $this->fetchItem($id); 

     $item = new Item(); 
     $item->setId($id); 
     $item->setName($itemData['name']); 
     $this->getEntityManager()->persist($item); 
     $this->getEntityManager()->flush(); 
      } 
     } 

     private function findItem($id) 
     { 
     $query = $this 
      ->getEntityManager() 
      ->createQuery('SELECT i from MonkeyWire\WowProfToolsBundle\Entity\Item i WHERE i.id = ?1'); 
     $query->setParameter(1, $id); 
     $query->useResultCache(true); 

     return $query->getOneOrNullResult(); 
     } 

     private function fetchItem($id) 
     { 
     $api = new Client(); 
     $api->setRequest(new Curl()); 

     try 
      { 
     $itemData = $api->getItemsApi()->getItem($id); 
      } 
     catch (NotFoundException $e) 
      { 
     $itemData['name'] = "na"; 
      } 

     return $itemData; 
     } 
    } 

답변

0

는 소리가 난다.

$query->expireResultCache();

는 저장소를 바탕으로 당신은하지만 그것을 수용하기 위해 일부 구조 조정을 할 필요가 있습니다

나는 당신의 아이디어를 시도
class ItemRepository extends EntityRepository 
{ 
    public $findQuery = null; 
    ... 
    public function findOrFetch($id) 
    { 
     ... 
     $this->getEntityManager()->flush(); 
     $this->findQuery->expireResultCache(); 
      } 
    } 

    private function findItem($id) 
    { 
     $query = $this 
     ->getEntityManager() 
     ->createQuery('SELECT i from MonkeyWire\WowProfToolsBundle\Entity\Item i WHERE i.id = ?1'); 
     $query->setParameter(1, $id); 
     $this->findQuery = $query; 
     ... 
    } 
} 
+0

, 나는 그러나 그 뒤에 생각을 이해하고, 여전히 오류가 발생합니다. OP에 몇 가지 더 많은 설명을 추가했습니다. – Roger