NHibernate - Önbelleğe alma

Bu bölümde, cachingNHibernate uygulamalarında çalışır. Önbelleğe alma için yerleşik desteğe sahiptir. Basit bir özellik gibi görünse de gerçekte en karmaşık özelliklerden biridir. Birinci Seviye Önbellek ile başlayacağız.

Birinci Seviye Önbellek

Bu önbellek mekanizması, NHibernate'de varsayılan olarak etkindir ve önbellekle çalışmak için hiçbir şey yapmamıza gerek yoktur. Bunu anlamak için, veritabanımızda iki kaydımızın olduğunu görebileceğiniz gibi, basit bir örneğe bakalım.

Şimdi bu örnekte, kimliği 1 olan öğrenciyi alacağız ve aşağıdaki kodda gösterildiği gibi aynı oturum sorgusunu iki kez kullanacağız.

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cache; 
using NHibernate.Cfg; 
using NHibernate.Dialect;
using NHibernate.Driver; 
using NHibernate.Linq; 

using System; 
using System.Linq; 
using System.Reflection;
namespace NHibernateDemoApp { 
   
   class Program { 
      static void Main(string[] args) {
		
         NHibernateProfiler.Initialize(); 
         var cfg = new Configuration(); 
			
         String Data Source = asia13797\\sqlexpress;
         String Initial Catalog = NHibernateDemoDB;
         String Integrated Security = True;
         String Connect Timeout = 15;
         String Encrypt = False;
         String TrustServerCertificate = False;
         String ApplicationIntent = ReadWrite;
         String MultiSubnetFailover = False;
         
         cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source + 
            Initial Catalog + Integrated Security + Connect Timeout + Encrypt +
            TrustServerCertificate + ApplicationIntent + MultiSubnetFailover";
				
            x.Driver<SqlClientDriver>(); 
            x.Dialect<MsSql2008Dialect>(); 
            x.LogSqlInConsole = true; 
            x.BatchSize = 10; 
         }); 
         
         //cfg.Configure(); 
         
         cfg.Cache(c => { 
            c.UseMinimalPuts = true; 
            c.UseQueryCache = true; 
         }); 
			
         cfg.SessionFactory().Caching .Through<HashtableCacheProvider>()
            .WithDefaultExpiration(1440); 
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         var sefact = cfg.BuildSessionFactory(); 
         
         using (var session = sefact.OpenSession()){ 
			
            using (var tx = session.BeginTransaction()) { 
               var studentUsingTheFirstQuery = session.Get<Student>(1);
               var studentUsingTheSecondQuery = session.Get<Student>(1); 
            } 
            
            Console.ReadLine(); 
         } 
      } 
   } 
}

Şimdi bu uygulamayı çalıştıralım ve sonucu NHibernate Profiler'da görelim.

NHibernate'in yalnızca bir sorgu başlattığını görünce şaşıracaksınız. NHibernate ilk seviye önbelleği böyle kullanır. İlk sorgu yürütüldüğünde, NHibernate, öğrenciyi ilk seviye önbelleğinde ID = 1 ile önbelleğe aldı.

Bu nedenle, ikinci sorgu yürütüldüğünde, NHibernate ilk önce ID = 1 olan birinci seviye önbellek Öğrenci varlığını arar, eğer o varlığı bulursa, NHibernate bunu bilir, aynı çalışan nesnesini tekrar almak için başka bir sorguyu çalıştırmaya gerek yoktur. .