Nhibernate-profiler

提供:Dev Guides
移動先:案内検索

NHibernate-プロファイラー

この章では、データベースのすべてのレコードが*取得、更新、作成、削除*され、これらのクエリがどのように実行されるのかを理解します。

これらすべてを理解するために、コンソールに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句*は、実際にはID、FirstMidNameおよびLastNameを取得する句に似ています。 したがって、大量のレコードをサーバーに戻してサーバー側で処理するのではなく、これらすべてをデータベースに送信してそこで処理しています。

NHibernate Profiler

これらの結果を見る別の方法は、NHibernate Profilerを使用することです。 NHibernate Profilerは商用ツールですが、NHibernateアプリケーションでの作業には非常に便利です。 NuGetからNHibernate Profilerをアプリケーションに簡単にインストールできます。

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

PM> install-package NHibernateProfiler

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

NHibernate Profiler

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

これで、NHibernate ProfilerはWebアプリケーションで動作するように最適化され、ソリューションエクスプローラーに* App_Startフォルダー*が追加されていることがわかります。 これらすべてをシンプルに保つには、App_Startフォルダーを削除します。また、プログラムクラスの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();
         }
      }

   }
}

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

NHibernate Profiler Application

ここに表示されているように、トランザクションが開始されたこと、SQLがデータベースに対して実行していることを素敵な形式で表示する素晴らしい表示があります。

したがって、これは、NHibernateアプリケーションの内部で何が起こっているかを正確に判断するのに非常に役立ちます。 アプリケーションが一定レベルの複雑さになると、信じられないほど便利になります。SQLプロファイラのようなものが必要ですが、NHibernateの知識が必要です。