2014-12-17 12 views
6

NHIbernate 4'ü asp.net mvc 4 (.net 4) uygulamamızda kullanıyoruz. NHibernate 4'ün davranışının ikinci seviye önbellekleme söz konusu olduğunda biraz değiştiğini söyleyebilirim.NHibernate 4: İkinci düzey önbellek kullanımı için temkinli yük çocuk koleksiyonları

aşağıdaki davranış (hatam varsa düzeltin lütfen) değişmiş gibi görünüyor:

  • artık ikinci düzey önbellek
  • kullanırken gibi bir sorgu çalıştırdığınızda gerekli bir işlem yoktur (Hibsession .Query(). Burada (x => x.Name == "x") ToList()), daha sonra entit varlık için sorgulayacaktır. NHibernate'in önceki sürümlerinde - doğru hatırlıyorsam - yalnızca kimliğin kimliği alınacaktı.

İkinci seviye sadece aşağıdaki durumlarda geçerlidir geliyor bana:

using (var hibSession = SessionFactory.OpenSession()) 
{ 
    // Second level cache working 
    var entity = hibSession.Get<ChachedEntity>(7); // second level cache working 
    var parent = entity.ParentElement; // second level cache working because n:1 

    // Probably working (not tested) 
    var elements = hibSession.Query<ChachedEntity>().Cacheable().Take(30).ToList(); // guessed behaviour: query-cache selects id's and then then uses second level cache 

    // second level cache NOT Working 
    var children = entity.ChildCollectionWithCachableEntities; // second level cache NOT working because 1:n (!!) 
} 

Sorularım şimdi şunlardır:

  • Nerede tarif NHibernate 4 ikinci seviye önbellek davranıştır (veya en azından belgelenen 3 sürümüne geçer)
  • Tembel yükleme alt öğeleri için ikinci düzey önbelleği kullanmak mümkün mü? (Veya en azından sadece id en yüklü olduğundan emin olmak ve daha sonra ikinci seviye önbellek varlıkları materialize var) önceden

Teşekkür

cevap

0

İşlemleri hala ihtiyaç vardır. Önbelleğe alınmış bazı öğeleri güncellemeye başlar başlamaz, bunları kullanmamak önbelleği devre dışı bırakır. (See here as for why, geçenlerde en NH sürümü ile ısırıldı. Ben salt okunur okuma kaydedilmiş sorguları ilgili kilitlenmeleri ortadan kaldırır SQL Server etkinleştirilmiş. Dahası read committed snapshot Having işlem? Hayır bahane ... gözardı Neden)

Koleksiyon önbelleğe alma işleri ancak koleksiyon haritalamada yapılandırılmalıdır. Setlerinize ve önbelleğe alınması gereken diğer koleksiyonlara bir <cache usage="..." /> düğümü ekleyin. Bunların içerilen varlıklarının, bunun gerçekten faydalı olması için de önbelleklenebilir olması gerekir. (Toplama yalnızca önbelleklerle ilişkili varlıklar birincil anahtarlarını önbelleğe alır.)

Sorgulama mekanizmasının yüklenememesi için yalnızca DB'den gelen kimlikler yükleniyor, NHibernate'in uzun süreli kullanıcısı olmamasına rağmen, hiçbir zaman şahit olmadım. (0,9 sürümünden beri kullanıyorum, zaten çok olgun ve zengin özelliklere sahip.) Bildiğim kadarıyla, NH 4 ile ikinci seviye önbellekte herhangi bir ciddi değişiklik olmadı. Bunları issues and changes tracker numaralı telefondan kontrol edebilirsiniz.

İlgili konular