NHibernate-캐싱

이 장에서는 cachingNHibernate 응용 프로그램에서 작동합니다. 캐싱을 기본적으로 지원합니다. 단순한 기능으로 보이지만 실제로는 가장 복잡한 기능 중 하나입니다. 첫 번째 수준 캐시부터 시작하겠습니다.

첫 번째 수준 캐시

이 캐시 메커니즘은 NHibernate에서 기본적으로 활성화되어 있으며 캐시 작업을 위해 아무것도 할 필요가 없습니다. 이를 이해하기 위해 데이터베이스에 두 개의 레코드가 있음을 알 수 있듯이 간단한 예를 살펴 보겠습니다.

이제이 예제에서는 ID가 1 인 학생을 검색하고 다음 코드와 같이 동일한 세션 쿼리를 두 번 사용합니다.

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

이제이 응용 프로그램을 실행하고 NHibernate Profiler에서 결과를 봅니다.

NHibernate가 하나의 쿼리 만 실행한다는 사실에 놀랄 것입니다. 이것이 NHibernate가 첫 번째 레벨 캐시를 사용하는 방법입니다. 첫 번째 쿼리가 실행되면 NHibernate는 첫 번째 수준 캐시에 ID = 1 인 Student를 캐시했습니다.

따라서 두 번째 쿼리가 실행될 때 NHibernate는 먼저 ID = 1 인 첫 번째 레벨 캐시 Student 엔티티를 조회하고 해당 엔티티를 찾으면 NHibernate는 동일한 직원 객체를 다시 검색하기 위해 다른 쿼리를 실행할 필요가 없음을 알고 있습니다. .