środa, 30 stycznia 2013

70-516 Monitorowanie wydajności LINQu, Entity Framework

Używając LINQ2SQL oraz Entity Framework możemy na bieżąco monitorować wysyłane zapytania do bazy danych.
Aby logować zapytania wysyłane przez LINQ2SQL należy na obiekcie DataContext ustawić właściwość Log. Przypisać do niej możemy dowolny obiekt klasy dziedziczącej po TextWriter.
W książce do egzaminu podano bardzo dobry przykład stworzenia klasy dziedziczącej po TextWriter która wypisuje zapytania LINQ do okienka Output. Zaletą klasy jest możliwość włączania logowania za pomocą konfiguracji w App/Web .config Zrealizowane jest to za pomocą klasy BooleanSwitch
Przykład który znajduje się w książce:

Code:
    public class LinqToSqlTraceWriter : TextWriter
    {
        private BooleanSwitch logSwitch;
        public LinqToSqlTraceWriter(string switchName)
        {
            logSwitch = new BooleanSwitch(switchName, switchName);
        }

        public override Encoding Encoding
        {
            get { throw new SystemNotImplementedException(); }
        }

        public override void Write(char value)
        {
            if (logSwitch.Enabled)
            {
                Trace.Write(value);
            }
        }

        public override void Flush()
        {
            Trace.Flush();
        }

        public override void Close()
        {
            Trace.Close();
        }
    }

Przełącznik konfigurujemy w app/web configu:

Code:
  <system.diagnostics>
    <switches>
      <add name="LinqToSqlSwitch" value="1"/>
    </switches>
  </system.diagnostics>

Aby włączyć logowanie należy obiektowi DataContext.Log przypisać obiekt klasy LingToSqlTextWriter.

W przypadku Entity Framework treść zapytania wysyłanego do bazy danych otrzymujemy wywołując na obiekcie klasy ObjectQuery<T> metodę ToTraceString. Sposób w jaki to zrobić znaleźć można w innym moim wpisie: http://patryknet.blogspot.com/search?q=ToTraceString


Innym sposobem śledzenia wydajności jest zaimplementowanie Monitora wydajności:

Code:
            string catName = "LINQ";
            if (!PerformanceCounterCategory.Exists(catName))
            {
                PerformanceCounterCategory.Create(catName, "Category help",
                                                  PerformanceCounterCategoryType.SingleInstance, "LINQ2SQL", "Pomoc");
            }
            var performanceCounter = new System.DiagnosticsPerformanceCounter(catName, "LINQ2SQL", false);
            performanceCounter.IncrementBy(100);

Brak komentarzy:

Prześlij komentarz