2010-10-13 23 views
8

oturumları arasında oturumları önbelleğe alma Bir web uygulaması geliştiriyorum ve web isteklerine devam etmek için önbelleğe almak istiyorum. İlk seviye önbelleğinin yalnızca oturum başına olduğunu biliyorum. İkinci düzey önbelleğe alma özelliğini etkinleştirdim ve bu, sorgular için çalışıyor.NHibernate SysCache

Ancak, ikinci düzey önbellek "alma" varlıkları için çalışıyor gibi görünmüyor ... bu nedenle, DB çalışmalarının çoğu, web istekleri arasında önbelleğe alınmıyor.

Bu normal/istenen davranış mı? Her sorgu hızlı olsa da, varlıklar önbelleğe alınabiliyorsa bu gereksiz görünüyor, ancak veritabanına çok sayıda gidiş dönüş yapan belirli bir sayfayı inceliyorum.

Düzenleme

Ben ikinci seviye önbellek etkin böylece Tamam, ve sorgular için çalışıyor. Sadece varlıklar için çalışmayı başaramıyorum. Test ettiğim ana varlığım üzerinde Cache.Is(c => c.ReadWrite()) (akıcı nhibernate) var. Ama hayır, hala her defasında DB'ye vuruyor. Herhangi bir fikir?

Düzenleme

ben şöyle kullanarak işlemleri denedim:

public override Accommodation Get(int id) 
{ 
    using (var tx = Session.BeginTransaction()) 
    { 
     var accomm = Session.Get<Accommodation>(id); 
     tx.Commit(); 
     return accomm; 
    } 
} 

Benim haritalama (ve biz kötü bir şema var görebilir) şekildedir:

public void Override(AutoMapping<Core.Entities.Itinerary.Accommodation.Accommodation> mapping) 
{ 
    mapping.HasManyToMany(x => x.Features).Table("AccommodationLinkFeatureType").ChildKeyColumn("FeatureTypeId").NotFound.Ignore(); 
    mapping.HasManyToMany(x => x.SimilarAccommodation).Table("AccommodationLinkSimilarAccommodation").ChildKeyColumn("SimilarAccommodationId").NotFound.Ignore(); 
    mapping.HasMany(x => x.TourItinerary).Table("AccommodationTourItinerary"); 
    mapping.HasOne(x => x.Images).ForeignKey("AccommodationId").Cascade.All().Not.LazyLoad(); 
    mapping.References(x => x.CollectionType).NotFound.Ignore().Not.LazyLoad(); 
    mapping.References(x => x.AccommodationUnitType).NotFound.Ignore().Not.LazyLoad(); 
    Cache.Is(c => c.ReadWrite()); 
} 

Ancak, bu hala 2. seviye önbellekten alınmıyor gibi görünüyor.

arada, bir çok örnek çevrimiçi Cache.ReadWrite() kullanarak ama sadece Önbellek yardımcı bir Is yöntemi görebilirsiniz bkz yüzden Cache.Is(c => c.ReadWrite()) çalışıyorum - akıcı arayüz değişti?

+1

kolay yolu bir web oturumu içinde senin NHibernate oturumu tasarrufu olacağını, ama bu tavsiye etmiyorum: Muhtemelen 2. düzey önbelleğe düzeltmek gerekir P - Bu yayını okumak vardır: http: // blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/first-and-second-level-caching-in-nhibernate.aspx?Bağlantı için – rsenna

+0

+1, ancak benim düzenleme –

+0

kod + eşleme? – Paco

cevap

4

Bunu test etmedim, ancak benim anlayışım, işlemleri gerçekleştirmenin nesneleri ikinci düzey önbelleğe yerleştiren sihir olduğunu. Bir işlem dışında okuma işlemleri yapıyorsanız, nesneler ikinci düzey önbelleğe yerleştirilmeyecektir.

+0

Teşekkürler, ben de bunu keşfettim. Bkz. Http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions –

+0

Aslında, bu sorunu düzeltmek için görünmüyordu. Düzenleme konusuna bakın. –

0

Aynı problem vardı. Benim durumumda, Referanslar NotFound() ile eşleştirilmiştir.) Yoksay() (yani (eğer bu yabancı anahtarla hiçbir varlık bulunmazsa, bunu görmezden gelinir, ki bu aslında bir veri tutarlılığı hatasıdır). NotFound.Ignore kaldırın ve db.

+0

Tüm zaman ve iyi, verilerin üzerinde tam kontrol sahibi olmadığınız eski bir veritabanıyla çalışmadığınız sürece. –

0

Belki önbellek sağlayıcınızın yapılandırmasında bir sorun yaşıyorsunuz. Burada açıklandığı gibi, yapmam gerektiğinde, sen 2. seviye önbellek sağlayıcı olarak Couchbase kullanarak istediğiniz istiyorsun mümkün: Dağıtım çevre Azure üzerinde olduğunu

http://blog.couchbase.com/introducing-nhibernate-couchbase-2nd-level-cache-provider

Eğer ben bu yararlı olabilir sanırım. SysCache modülünün AzureMemcached modülü ile birlikte bulunamayacağını unutmayın.

http://www.webmoco.com/webmoco-development-blog/orchard-cms-second-level-caching