2015-02-12 3 views
0

Я хочу записать запрос EF (или транзакцию) обратно в базу данных, чтобы я мог контролировать производительность в живой системе. Примечание. Я знаю, что в моем UOW может появиться несколько запросов. Это нормально, я просто хочу сказать, какие области системы замедляются и т. Д.Запрашивать время запроса EF в базе данных

Каков наилучший способ для этого? Моя первоначальная мысль заключалась в том, чтобы сделать это в UnitOfWork.Dispose(), чтобы каждый запрос автоматически регистрировался после завершения. Но это немного пахнет, потому что мне нужно будет позвонить Save(), чтобы сохранить информацию, но что, если вызывающий абонент не захочет сохранять?

Есть ли другой способ, я могу автоматически регистрировать время запроса в базе данных?

protected virtual void Dispose(bool disposing) 
{ 
    if (this.logQueryToDatabase) 
    { 
     var timeTaken = DateTime.UtcNow - this.start; 
     LogPerformance(this.callingFnName, timeTaken.TotalMilliseconds); 
    } 

    this.ctx.Dispose(); 
} 

ответ

1

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

Класс профилировщика.

public class Profiler:IDisposable 
{ 
    private readonly string _msg; 
    private Stopwatch _sw; 

    public Profiler(string msg) 
    { 
     _msg = msg; 
     _sw = Stopwatch.StartNew(); 
    } 

    public void Dispose() 
    { 
     _sw.Stop(); 
     LogPerformance(_msg, _sw.ElapsedMilliseconds); 
    } 
} 

Использование:

using (new Profiler("Saving products")) 
{ 
    db.SaveChanges(); 
} 
Смежные вопросы