いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DevExpress奮闘記-107 (XPO, XPO Profiler, XPOの状態をプロファイリング, localhost, log)

前回、XPOのロギングについてちょっとメモしたのですが
最近のDXのバージョン(DXv1以降、つまり、v11以降)にはXPO Profilerという、XPO専用のプロファイラーが付属しています。


このツールを利用すると、前回のような内部で発行されているクエリはもちろんセッションやUOWの状態もトラッキングできます。


利用方法も結構簡単でした。
以下、ローカルホスト内でのプロファイリングを試してみたのでメモします。


起動すると、以下のウィンドウが表示されます。


XPO Profilerは、内部でWCFサービスを起動してプロファイリングを行います。
File→Newから、WCFサービスの設定を行います。今回は、デフォルトの設定のままOKをクリック。


後は、サービスを起動するとツール側の準備が整います。


後残りの作業は、XPOが実行されるアプリ側の方です。
XPO Profilerを利用する場合、アプリケーション構成ファイルに設定を記述する必要があります。
が、ツール側に自動でこの設定を入れてくれるコマンドがあるのでそれを利用すれば一発です。
File→Update App.configをクリックして、目的のアプリのapp.configを指定すると以下のような設定が書き込まれます。

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="DevExpressXpoProfiler"
             type="DevExpress.Xpo.Logger.ProfilerConfigSection, DevExpress.Data.v12.1, Version=12.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
             allowLocation="true"
             allowDefinition="Everywhere" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0"
                      sku=".NETFramework,Version=v4.0" />
  </startup>
  <DevExpressXpoProfiler serverType="DevExpress.Xpo.Logger.Transport.LogServer"
                         serverAssembly="DevExpress.Xpo.v12.1, Version=12.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
                         categories="SQL;Session;DataCache"
                         port="52934" />
</configuration>


これで準備完了です。
後は、アプリを動作させると、自動的にプロファイリングされます。
アプリが実行されると、リアルタイムに結果が表示されていきます。


以下、サンプルソースです。

using System;
using System.Collections.Generic;
using System.Linq;
using DevExpress.Xpo;

namespace XPO07
{
  class Program
  {
    static void Main(string[] args)
    {
      //
      // XPO Profilerで、コンソールアプリをプロファイリング出来るかどうかのサンプル.
      // (設定は、App.configファイルに記述されている。)
      //
      using (UnitOfWork uow = new UnitOfWork())
      {
        var count = uow.Query<MyData>().Count();
        if (count == 0)
        {
          for (int i = 0; i < 10; i++)
          {
            new MyData(uow) { Name = string.Format("name-{0}", i) };
          }

          uow.CommitChanges();
        }
      }

      using (UnitOfWork uow = new UnitOfWork())
      {
        var query = uow.Query<MyData>().Where(x => x.Name.EndsWith("0"));
        foreach (var item in query)
        {
          Console.WriteLine(item.Name);
        }
      }

      Console.ReadLine();
    }
  }

  public class MyData : XPObject
  {
    public MyData(Session session)
      : base(session)
    { }

    // Fields...
    private string _name;

    public string Name
    {
      get
      {
        return _name;
      }
      set
      {
        SetPropertyValue("Name", ref _name, value);
      }
    }
  }
}


上記の処理を実行すると以下のようにプロファイリングされます。



尚、結果をログファイルとして保存しておきたい場合
File→Export Logで、テキストファイルかExcelファイルかを選んで出力できます。



================================
過去の記事については、以下のページからご参照下さい。