2017-11-20 7 views
1

특정 지역에 대한 레벨 2 캐시를 수동으로 지우려고합니다. 게시 된 방법이 in answer to this question 인 것을 발견했습니다. 이 작업이 엔티티를 정리하는 동안 어떤 이유로 쿼리 캐시가 지워지지 않고 있습니다. 이로 인해 엔티티가 다음에 데이터베이스에서 검색 될 때 각 엔티티에 대한 별도의 쿼리가 생성됩니다. 내가 매개 변수없이 sessionFactory.EvictQueries()를 호출하면 if가 작동합니다. 특정 지역 이름을 전달할 때만 작동하지 않습니다. 무엇이 잘못 될지에 대한 아이디어가 있습니까?Nhibernate 특정 지역에 대한 캐시 지우기

코드는 위의 링크에서입니다 :

private void ClearRegion(string regionName) 
    { 
     _sessionFactory.EvictQueries(regionName); 

     foreach (var collectionMetaData in _sessionFactory.GetAllCollectionMetadata().Values) 
     { 
      var collectionPersister = collectionMetaData as NHibernate.Persister.Collection.ICollectionPersister; 
      if (collectionPersister != null) 
      { 
       if ((collectionPersister.Cache != null) && (collectionPersister.Cache.RegionName == regionName)) 
       { 
        _sessionFactory.EvictCollection(collectionPersister.Role); 
       } 
      } 
     } 

     foreach (var classMetaData in _sessionFactory.GetAllClassMetadata().Values) 
     { 
      var entityPersister = classMetaData as NHibernate.Persister.Entity.IEntityPersister; 
      if (entityPersister != null) 
      { 
       if ((entityPersister.Cache != null) && (entityPersister.Cache.RegionName == regionName)) 
       { 
        _sessionFactory.EvictEntity(entityPersister.EntityName); 
       } 
      } 
     } 
    } 

캐싱 작업과 NHProfiler를 사용하여 확인됩니다.

+0

nhusers 그룹 (https://groups.google.com/forum/#!forum/nhusers)에서 질문 해 보셨습니까? –

+0

문제가 있는지보기 위해 일부 코드와 설정을 공유해야 할 수도 있습니다. – Najera

답변

0

좋아, 그래서 내 문제를 알아 냈어. 엔티티 매핑에서 데이터를 지정하는 것 외에 데이터를 쿼리 할 때 캐시 영역을 지정하는 것이 필요하다는 것을 알지 못했습니다. 내 쿼리에 .CacheRegion("regionName")을 추가하면 모든 것이 작동합니다. 쿼리 할 때 영역을 추가하지 않으면 영역 이름없이 쿼리 캐시로 이동합니다. 그래서 .EvictQueries()을 지역 이름 매개 변수없이 호출했을 때 작동했습니다.

요약하면 엔터티 (.Region("regionName")은 Fluent를 사용하는 경우)를 매핑 할 때 영역 이름을 추가하고 .CacheRegion("regionName")을 사용하여 세션을 사용하여 쿼리 할 때 영역 이름을 추가해야합니다.

답장을 보내 주셔서 감사합니다.