Учебники

NHibernate — Профилировщик

В этой главе мы поймем, как все записи из базы данных извлекаются, обновляются, создаются и удаляются, и как именно эти запросы выполняются?

Чтобы понять все это, мы можем просто добавить опцию в нашу конфигурацию, которая регистрирует SQL в консоли. Вот простое утверждение, которое будет регистрировать запрос SQL —

x.LogSqlInConsole = true;

Теперь у нас есть две записи в нашей таблице учеников в базе данных NHibernateDemoDB. Давайте извлечем все записи из базы данных, как показано в следующем коде.

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

Итак, давайте продолжим и снова запустим это приложение, и вы увидите следующий результат:

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

Как видите, предложение select , отправляемое в базу данных, фактически похоже на предложение, которое будет извлекать ID, FirstMidName и LastName. Таким образом, все это отправляется в базу данных и обрабатывается там, вместо того, чтобы много записей возвращалось на ваш сервер и обрабатывалось на стороне сервера.

NHibernate Profiler

Еще один способ взглянуть на эти результаты — использовать NHibernate Profiler. NHibernate Profiler — это коммерческий инструмент, но он очень полезен для работы с приложениями NHibernate. Вы можете легко установить NHibernate Profiler в свое приложение из NuGet.

Давайте перейдем к консоли диспетчера NuGet из меню Сервис, выбрав Диспетчер пакетов NuGet → Консоль диспетчера пакетов. Откроется окно консоли диспетчера пакетов. Введите следующую команду и нажмите ввод.

PM> install-package NHibernateProfiler

Он установит все необходимые двоичные файлы для NHibernate Profiler, после его успешной установки вы увидите следующее сообщение.

NHibernate Profiler

Вы также увидите, что NHibernate Profiler запускается после его установки. Для его использования потребуется лицензия, но для демонстрационных целей мы можем использовать 30-дневную пробную версию NHibernate Profiler.

Теперь NHibernate Profiler оптимизирован для работы с веб-приложениями, и вы увидите, что он добавил папку App_Start в обозревателе решений. Для простоты удалите папку App_Start, и вы также увидите, что один оператор добавляется в начале метода Main в классе Program.

App_Start.NHibernateProfilerBootstrapper.PreStart();

Также удалите этот оператор и просто добавьте простой вызов NHibernateProfiler.Initialize, как показано в следующем коде.

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

Теперь, когда вы запустите приложение, оно отправит данные в приложение NHibernate Profiler.

Приложение NHibernate Profiler

Вы можете видеть здесь, у нас есть хороший дисплей, который показывает, что мы начали транзакцию, что SQL делает с базой данных в хорошем формате.

Так что это очень полезно для определения того, что именно происходит внутри вашего приложения NHibernate. Это становится невероятно полезным, когда приложение достигает определенного уровня сложности, когда вам нужно нечто более похожее на SQL Profiler, но со знанием NHibernate.