NHibernate - Профайлер

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

Чтобы понять все это, мы можем просто добавить в нашу конфигурацию параметр, который регистрирует 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 clauseбудучи отправленным в базу данных, это фактически похоже на предложение, которое будет извлекать идентификатор, FirstMidName и LastName. Таким образом, все это отправляется в базу данных и обрабатывается там, вместо того, чтобы возвращать множество записей на ваш сервер и обрабатывать на стороне сервера.

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

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

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

PM> install-package NHibernateProfiler

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

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

Теперь NHibernate Profiler оптимизирован для работы с веб-приложениями, и вы увидите, что он добавил App_Start folderв обозревателе решений. Чтобы все было просто, удалите папку 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.

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

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