2012-02-24 20 views
5

nHibernate uygulamasında bir dizi önbellek bölgesi var. Yük dengeli web sunucularında sorun yaşanmasını önlemek için, önbelleğe alınan verileri düzenleyen sayfalardaki önbelleğe alma işlemini etkin bir şekilde devre dışı bırakmak istiyorum. Tüm sorgu önbelleklerimi, sınıf önbellekleri ve varlığımın kolayca önbelleğe alınmasını engelleyen bir yöntem yazabilirim.NHibernate ikinci düzey önbellekleme - tahliye bölgeleri

Ancak gerçekten istediğim, önbelleği bölgeye göre temizlemektir. sessionFactory.EvictQueries() bir bölge parametresi alır, ancak Evict() ve EvictCollection() bunu yapmaz. Buradaki önbelleği gerçekten atmak istemiyorum, ne tür önbellek bölgeleriyle ilişkilendiren bir çeşit sakar sözlüğü tutmak istemiyorum. NHibernate, bir önbellek ayarlarının ne olduğunu bir koleksiyona veya koleksiyona sorma yolu var mı?

teşekkürler

+0

Hey @Ted, el ile bir şeyler yapmaya çalışıyormuşsunuz gibi görünüyor. Veri deposunda bir değişiklik yapıldığında öğeleri otomatik olarak tahliye etmek için bir çeşit önbellek bağımlılığı kurmamanızın bir nedeni var mı? SqlCacheDependency gibi mi? – swannee

+0

veya daha iyi dağıtılmış bir önbellek kullanın? nHibernate, –

+0

'u destekliyor, dağıtılmış bir önbellek kullanmayı çok isterim ama müşteriler, aptalca müşteri nedenleri için hevesli değiller. Şimdi CacheDependency'e bakıyorum, ancak Oracle kullanıyoruz, bu yüzden SQL Server uygulamasının benim için bir faydası yok. Yoklama ile dbCacheDependency çalışmalarının genel uygulaması gibi görünüyor ve bazı OLEDB şeyler dayanıyor. Bu performans mı? Sürücü seçimlerimin sonuçları var mı? DataDirect ve Devart gibi ODP.NET gibi 3. parti Oracle sürücülerine bakıyorum. – Ted

cevap

0

Tamam, kendi sorumu yanıtladım gibi görünüyor. NHibernate meta verisini çektiğinizde döndürülen varsayılan arabirim, önbelleğe alma hakkında bilgi sağlamaz, ancak bunun uygulamalarını kazarsanız, bunu yapar. Biraz hantal, ama iş yapıyor.

4

Ben de aynı şeyi yaptım. Herkesin yararına göre, burada oluşturduğum yöntem:

public void ClearCache(string regionName) 
    { 
     // Use your favourite IOC to get to the session factory 
     var sessionFactory = ObjectFactory.GetInstance<ISessionFactory>(); 

     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); 
       } 
      } 
     } 
    }