NHibernate-プロファイラー

この章では、データベースのすべてのレコードがどのようになっているのかを理解します retrieved, updated, created, and deleted そして、これらのクエリはどの程度正確に実行されますか?

これらすべてを理解するために、SQLをコンソールに記録するオプションを構成に追加するだけです。これはSQLクエリをログに記録する簡単なステートメントです-

x.LogSqlInConsole = true;

これで、NHibernateDemoDBデータベースのstudentテーブルに2つのレコードがあります。次のコードに示すように、データベースからすべてのレコードを取得してみましょう。

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データベースに送信されるのは、実際にはID、FirstMidName、LastNameを取得する句のようなものです。したがって、これはすべてデータベースに送信されてそこで処理されるのであり、多くのレコードがサーバーに戻されてサーバー側で処理されるのではありません。

NHibernateプロファイラー

これらの結果を確認する別の方法は、NHibernateProfilerを使用することです。NHibernate Profilerは商用ツールですが、NHibernateアプリケーションでの作業に非常に役立ちます。NHibernateプロファイラーはNuGetからアプリケーションに簡単にインストールできます。

NuGetパッケージマネージャー→パッケージマネージャーコンソールを選択して、[ツール]メニューからNuGetマネージャーコンソールに移動しましょう。パッケージマネージャーコンソールウィンドウが開きます。次のコマンドを入力して、Enterキーを押します。

PM> install-package NHibernateProfiler

NHibernate Profilerに必要なすべてのバイナリがインストールされます。正常にインストールされると、次のメッセージが表示されます。

また、NHibernate Profilerがインストールされると、起動されることがわかります。使用するにはライセンスが必要ですが、デモの目的で、NHibernateProfilerの30日間の試用版を使用できます。

現在、NHibernate ProfilerはWebアプリケーションで動作するように最適化されており、追加されていることがわかります。 App_Start folderソリューションエクスプローラーで。これらすべてを単純にするために、App_Startフォルダーを削除します。また、ProgramクラスのMainメソッドの先頭に1つのステートメントが追加されていることを確認します。

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

これで、アプリケーションを実行すると、NHibernateProfilerアプリケーションにデータが送信されます。

ここで、トランザクションを開始したこと、SQLがデータベースに対して行っていることを適切な形式で示す優れた表示があります。

したがって、これはNHibernateアプリケーション内で何が起こっているのかを正確に判断するのに非常に役立ちます。アプリケーションがある程度複雑になると、SQLプロファイラーのようなものが必要になりますが、NHibernateの知識があれば、非常に便利になります。