2010-04-01 5 views
11

Fluent NHibernate를 구성하여 쿼리, 엔티티 등의 2 차 캐싱을 활성화하는 방법을 이해하려고합니다. 동시에 자동 매핑을 사용하십시오. 이를 수행하는 방법에 대한 온라인 정보는 거의 없습니다. 물론 클래스를 하나씩 매핑 할 때 수행 할 수 있습니다 ...하지만 자동 매핑은 어떨까요?Fluent NHibernate 캐싱 (자동 매핑 포함)

여기에 지금까지 내 구성 코드 :

AutoPersistenceModel model = AutoMap.AssemblyOf<Seminar>() 
.Where(t => t.Namespace == "[MY NAMESPACE]") 
.Conventions.Add(DefaultCascade.All()); 

Configuration config = Fluently.Configure() 
.Database 
(
    MsSqlConfiguration.MsSql2005 
    .ConnectionString(@"[MY CONNECTION STRING]") 
) 
.Mappings(m => m.AutoMappings.Add(model)) 
.BuildConfiguration(); 

_sessionFactory = config.BuildSessionFactory(); 

감사합니다!

답변

7

NHibernate Contribution 프로젝트에서 이미 2 단계 캐시 공급자를 다운로드했다고 가정하면 다음을 사용하여 자동 매핑 설정 내에서 캐시를 초기화 할 수 있어야합니다.

Configuration config = Fluently.Configure() 
.Database 
(
    MsSqlConfiguration.MsSql2005 
    .ConnectionString(@"[MY CONNECTION STRING]") 
    .Cache(c => c.UseQueryCache().ProviderClass<YourCacheProviderOfChoice>()) 
) 
.Mappings(m => m.AutoMappings.Add(model)) 
.BuildConfiguration(); 

캐시 할 쿼리를 선택하면 Criteria 인스턴스에서 SetCacheable (true)을 호출하기 만하면됩니다.

var query = session.CreateQuery("from Blog b where b.Author = :author") 
    .SetString("author", "Gabriel") 
    .SetCacheable(true); 
var list = query.List<Blog>(); 

는 NHibernate에의 제 1 및 제 2 레벨 캐시 좋은 참고 자료에 epic blog post이다.

+2

엔티티도 캐시하지 않으면 쿼리를 캐싱하는 것이 유용하지 않지만, 예를 들어. ''매핑을 사용합니다. – UpTheCreek

1

나는 잠시 동안 어려움을 겪어 왔지만 정보가 부족한 데는 놀랐다. 이 질문은 제가 찾을 수있는 최선의 것입니다. 심지어 여기에있는 대답은 엔티티 캐싱을 사용하는 방법을 말하지 않습니다. 여기에 내가 알아 낸 것이있다.

Fluently.Configure() 
    .Database(/* your DB config */) 
    .Cache(c => c.UseSecondLevelCache().ProviderClass<CacheProviderClass>()) 

당신은이 쿼리 캐시를 모두 사용할 수 있습니다 :

두 번째 레벨 캐시를 사용하려면

Fluently.Configure() 
    .Database(/* your DB config */) 
    .Cache(c => c.UseSecondLevelCache() 
     .UseQueryCache() 
     .ProviderClass<CacheProviderClass>()) 

은 당 개체 캐싱 활성화하려면 : 물론

.Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Entity>() 
       .Conventions.Add(ConventionBuilder.Class.Always(c => c.Cache.ReadWrite())) 
     ) 
) 

을, 원하는 경우 ReadOnly() 또는 NonStrictReadWrite()을 사용할 수 있습니다.

관련 문제