我想将EF查询(或事务)时间记录回数据库,以便我可以监视实时系统中的性能。注意我知道在我的UOW中可能会发生多个查询。没关系,我只是想知道系统的哪些区域正在减速等等。
对我来说,最好的方法是什么?我最初的想法是在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();
}
答案 0 :(得分: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();
}