NHibernate - Almacenamiento en caché

En este capítulo, cubriremos cómo el cachingfunciona en aplicaciones NHibernate. Tiene soporte incorporado para almacenamiento en caché. Parece una característica simple, pero en realidad, es una de las características más complejas. Comenzaremos con la caché de primer nivel.

Caché de primer nivel

Este mecanismo de caché está habilitado por defecto en NHibernate y no necesitamos hacer nada para trabajar con el caché. Para entender esto, echemos un vistazo a un ejemplo simple, como puede ver que tenemos dos registros en nuestra base de datos.

Ahora, en este ejemplo, recuperaremos el estudiante cuyo ID es 1 y usaremos la misma consulta de sesión dos veces como se muestra en el siguiente código.

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

Ahora ejecutemos esta aplicación y veamos el resultado en NHibernate Profiler.

Se sorprenderá al ver que NHibernate solo activa una consulta. Así es como NHibernate usa la caché de primer nivel. Cuando se ejecuta la primera consulta, NHibernate almacena en caché al Estudiante con ID = 1 en su caché de primer nivel.

Entonces, cuando se ejecuta la segunda consulta, NHibernate primero busca la entidad Student de caché de primer nivel con ID = 1, si encuentra esa entidad, entonces NHibernate sabe que no hay necesidad de disparar otra consulta para recuperar el mismo objeto de empleado nuevamente. .