NHibernate - Mise en cache

Dans ce chapitre, nous expliquerons comment le cachingfonctionne dans les applications NHibernate. Il a un support intégré pour la mise en cache. Cela ressemble à une fonctionnalité simple, mais en réalité, c'est l'une des fonctionnalités les plus complexes. Nous commencerons par le cache de premier niveau.

Cache de premier niveau

Ce mécanisme de cache est activé par défaut dans NHibernate et nous n'avons rien à faire pour travailler avec le cache. Pour comprendre cela, examinons un exemple simple, car vous pouvez voir que nous avons deux enregistrements dans notre base de données.

Maintenant, dans cet exemple, nous allons récupérer l'étudiant dont l'ID est 1 et nous utiliserons la même requête de session deux fois comme indiqué dans le code suivant.

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

Maintenant, exécutons cette application et voyons le résultat dans NHibernate Profiler.

Vous serez surpris de voir que NHibernate ne déclenche qu'une seule requête. C'est ainsi que NHibernate utilise le cache de premier niveau. Lorsque la première requête est exécutée, NHibernate a mis en cache l'étudiant avec l'ID = 1 dans son cache de premier niveau.

Ainsi, lorsque la deuxième requête est exécutée, NHibernate recherche d'abord l'entité Student du cache de premier niveau avec ID = 1, s'il trouve cette entité, alors NHibernate sait que, il n'est pas nécessaire de lancer une autre requête pour récupérer à nouveau le même objet employé. .