2012-05-15 2 views
5

doctrine에 문제가 있습니다. 나는 캐싱을 좋아하지만 Entity를 업데이트하고 플러시하면 doctrine2가 캐쉬를 지울 수 없어야합니까? 그렇지 않으면이 프로젝트는 많은 상호 작용을하기 때문에 캐시는 거의 쓸모가 없습니다. 문자 그대로 항상 모든 쿼리에 대해 캐시를 비활성화해야합니다. 캐시에 항상 캐시 된 이전 버전이 표시되면 사용자는 상호 작용을 볼 수 없습니다.Doctrine2 업데이트 된 요소 캐싱

방법이 있습니까?

+0

캐시를 완전히 끄시겠습니까? $ deleted = $ cacheDriver-> deleteAll();으로 캐시를 삭제할 수 있다는 것을 알고 있습니다. – Gohn67

+0

@ Gohn67 : 어떻게하면 CacheDriver를 얻을 수 있습니까? –

답변

1

이것은 캐시를 지우는 방법에 관한 Doctrine2의 문서에 따라 있습니다. 나는 이것이 당신이 원하는 것이라는 것을 확신하지 못하지만, 시도해 볼만한 것으로 생각됩니다.

Doctrine2의 캐시 드라이버는 다른 수준의 캐시 된 항목을 삭제합니다.

당신은 당신이 할 거라고 그래서

가 모두 삭제 캐시에 모든 값을 삭제 접두사와 일반으로, 접미사, 정규식을 사용하여 직접 ID로 삭제할 수 있습니다

$deleted = $cacheDriver->deleteAll(); 

을 그리고 접두사에 의해 삭제하려면, 당신은 할 줄 :

$deleted = $cacheDriver->deleteByPrefix('users_'); 

나는 그것에 대해 발굴하는 방법을 Doctrine2이 이름을 자신의 캐시 ID를하지만, 당신이 가진 것 때문에 확실하지 않다. 캐시 삭제에 대한

정보는 여기에서 찾을 수 : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting

캐시 드라이버를 얻으려면, 다음을 수행 할 수 있습니다. 문서에 설명되어 있지 않으므로 코드를 조금 짚어 보았습니다.

난 당신이 예에서 하나의 엔티티 관리자의 인스턴스가 있으리라 믿고있어 :

$config = $em->getConfiguration(); //Get an instance of the configuration 
$queryCacheDriver = $config->getQueryCacheImpl(); //Gets Query Cache Driver 
$metadataCacheDriver = $config->getMetadataCacheImpl(); //You probably don't need this one unless the schema changed 

는 다른 방법으로, 나는 당신이 레지스트리 클래스의 어떤 종류의 cacheDriver 인스턴스를 저장하고 그런 식으로 검색 할 수있는 것 같아요. 그러나 귀하의 취향에 달려 있습니다. 개인적으로 나는 레지스트리에 너무 많이 의존하지 않으려 고 노력합니다.

당신이 할 수있는 또 다른 일은 결과 캐시를 사용하지 않도록 실행중인 쿼리에 알려주는 것입니다. 다시 나는 이것이 당신이 원하는 것이라고 생각하지 않지만 단지 그것을 밖으로 던지고 있습니다. 주로 쿼리 캐시를 완전히 끌 수도 있습니다. 캐시를 사용하지 않으려는 몇 가지 특정 쿼리가 아니면 않는 것입니다.

이 예제는 문서에서입니다 : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#result-cache

$query = $em->createQuery('select u from \Entities\User u'); 
$query->useResultCache(false); //Don't use query cache on this query 
$results = $query->getResult(); 
+1

v.2.2.2에서 "deleteByPrefix()"가 삭제 되었습니까? 교리 소스에서 전체 검색을했고이 방법을 찾을 수 없습니다. –

+0

memcache 드라이버에서'deleteByPrefix'를 사용할 수 없습니다. – Sithu

3

같은 런타임 (요청) 내에 새로운 엔티티를 저장하고 가져 오는 것에 대해 이야기하고 있습니까? 그렇다면 엔터티를 새로 고쳐야합니다.

$entity = new Entity(); 
$em->persist($entity); 
$em->flush(); 
$em->refresh($entity); 

는 기업이 관리하고 변경하는 경우, 이러한 엔티티 객체에 적용되지만 $ 보하기를 호출 할 때 만> 데이터베이스에 플러시를 지속().

캐시가 새로운 요청에 대해 이전 데이터 집합을 반환하는 경우 (DB에서 성공적으로 업데이트되었지만) 버그를 발견 한 것 같습니다. 여기에 파일을 올릴 수 있습니다 >>http://www.doctrine-project.org/jira/secure/Dashboard.jspa

+0

나는 그것을 정확하게 시도했다. 엔티티를로드하고, 변경하고, 유지하고, 플러시하고, 새로 고칩니다. 여전히 동일합니다. 하지만 관련 객체가 캐시에서 계속 나오도록 관련 객체가 아닌 객체를 새로 고침했기 때문일 수 있습니다. –

+0

엔티티를 "로드"한다고 할 때, 엔티티를 생성하거나 DB에서 가져 오는 것을 의미합니까? 그 다음에 가져온 것이 "관리되는"상태이고 그 위에 persist() 메소드를 사용할 필요가 없다. 또한 관리되는 Entity를 새로 고치면 수정 한 내용을 제거 할 수 있습니다. 새로운 경우 : 만들기 -> 지속 -> 플러시 -> 새로 고침. 그것의 관리 (DB에서 가져온 경우) : 가져 오기 -> (변경) -> 플러시. –

+0

동일한 시도, 새로 고침 정말 "싸울"캐시에 도움이되지 않습니다. 다음과 같이 작동합니다. $ entity = $ service-> loadCached(); echo $ entity-> getData(); // 캐시 된 데이터를 반환합니다. $ em-> refresh(); echo $ entity-> getData(); // 캐시되지 않은 데이터를 반환합니다. 소리가 잘 들지만 실제로는 캐시가 무효화되지 않으므로 다음에 loadCached()를 실행할 때 이전 데이터가 계속 유지됩니다. 다른 방법이없는 것처럼 보이지만 Gohn67과 같이 수동으로 캐시를 삭제하는 것이 좋습니다. –

3

Doctrine2는 결코 같은 것이 더 많은 문제를 야기하기 때문에 (3 년 전) 어떤 점에서 Doctrine1에 있었고, 제거 deleteByPrefix, 등 그 삭제 방법이 없습니다.

페이지 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting은 오래되었습니다 (doctrine2 문서의 다음 버전에서는 제거 된 메서드가 표시됨). 지금 수행 할 수있는 유일한 작업은 캐시를 수동으로 관리하는 것입니다. ID를 찾아 업데이트 할 때마다 수동으로 삭제하십시오.

고급 고급 교리 캐싱은 WIP : https://github.com/doctrine/doctrine2/pull/580입니다.

+0

예, 오래된 티켓, 아직도 나는 호기심입니다. 나는 "deleteByPrefix"를 찾고 있지만 그것에 대해 아무것도 찾을 수 없습니다. 어떤 종류의 문제가 있었습니까? 성능 문제? 어쩌면 나는 그것에 관한 새로운 질문을 열어야한다. – DoppyNL