NHibernate - Profiler

En este capítulo, entenderemos cómo todos los registros de la base de datos están retrieved, updated, created, and deleted y ¿cómo se realizan exactamente estas consultas?

Para comprender todo esto, simplemente podemos agregar una opción a nuestra configuración, que registra el SQL en la consola. Aquí está la declaración simple que registrará la consulta SQL:

x.LogSqlInConsole = true;

Ahora, tenemos dos registros en nuestra tabla de estudiantes en la base de datos NHibernateDemoDB. Recuperemos todos los registros de la base de datos como se muestra en el siguiente código.

using NHibernate.Cfg; 
using NHibernate.Dialect; 
using NHibernate.Driver; 

using System; 
using System.Linq; 
using System.Reflection;

namespace NHibernateDemoApp { 

   class Program { 
      
      static void Main(string[] args) { 
         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; 
         }); 
      
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         var sefact = cfg.BuildSessionFactory();
      
         using (var session = sefact.OpenSession()) { 
         
            using (var tx = session.BeginTransaction()) { 
               Console.WriteLine("\nFetch the complete list again\n");
               var students = session.CreateCriteria<Student>().List<Student>(); 
      
               foreach (var student in students) { 
                  Console.WriteLine("{0} \t{1} \t{2}", student.ID, student.FirstMidName,
                     student.LastName); 
               } 
               
               tx.Commit(); 
            } 
				
            Console.ReadLine(); 
         } 
      } 
   } 
}

Así que sigamos y ejecutemos esta aplicación nuevamente, y verá el siguiente resultado:

NHibernate: SELECT this_.ID as ID0_0_, this_.LastName as LastName0_0_,
   this_.FirstMidName as FirstMid3_0_0_ FROM Student this_

Fetch the complete list again

3 Allan Bommer
4 Jerry Lewis

Como puede ver, el select clausesiendo enviado a la base de datos, es en realidad como una cláusula que recuperará el ID, FirstMidName y LastName. Entonces, todo esto se envía a la base de datos y se procesa allí en lugar de tener muchos registros devueltos a su servidor y procesados ​​en el lado del servidor.

Perfilador NHibernate

Otra forma de ver estos resultados es utilizar NHibernate Profiler. NHibernate Profiler es una herramienta comercial, pero es muy útil para trabajar con aplicaciones NHibernate. Puede instalar fácilmente NHibernate Profiler en su aplicación desde NuGet.

Vayamos a la consola de NuGet Manager desde el menú Herramientas seleccionando NuGet Package Manager → Package Manager Console. Se abrirá la ventana de la Consola del Administrador de paquetes. Ingrese el siguiente comando y presione enter.

PM> install-package NHibernateProfiler

Instalará todos los binarios necesarios para NHibernate Profiler, una vez que se haya instalado correctamente, verá el siguiente mensaje.

También verá que se inicia NHibernate Profiler, una vez instalado. Requerirá una licencia para usarlo, pero para propósitos de demostración, podemos usar la versión de prueba de 30 días de NHibernate Profiler.

Ahora, NHibernate Profiler está optimizado para trabajar con aplicaciones web y verás que ha agregado App_Start folderen el explorador de soluciones. Para mantener todo esto simple, elimine la carpeta App_Start y también observará que se agrega una declaración al comienzo del método Main en la clase Program.

App_Start.NHibernateProfilerBootstrapper.PreStart();

Elimine esta declaración también y agregue una simple llamada NHibernateProfiler.Initialize como se muestra en el siguiente código.

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

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

         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         var sefact = cfg.BuildSessionFactory(); 
         
         using (var session = sefact.OpenSession()) { 
            
            using (var tx = session.BeginTransaction()){ 
               var students = session.CreateCriteria<Student>().List<Student>(); 
               Console.WriteLine("\nFetch the complete list again\n");
               
               foreach (var student in students) { 
                  Console.WriteLine("{0} \t{1} \t{2}", student.ID, student.FirstMidName,
                     student.LastName); 
               } 
					
               tx.Commit(); 
            } 
				
            Console.ReadLine(); 
         } 
      } 
   
   }
}

Ahora, cuando ejecute la aplicación, enviará datos a la aplicación NHibernate Profiler.

Puede ver aquí, tenemos una buena pantalla que muestra que hemos comenzado la transacción, lo que SQL le está haciendo a la base de datos en un formato agradable.

Así que esto es muy útil para determinar qué está sucediendo exactamente dentro de su aplicación NHibernate. Se vuelve increíblemente útil una vez que la aplicación alcanza un cierto nivel de complejidad, donde necesita algo más como un SQL Profiler, pero con el conocimiento de NHibernate.