我想编写一些自动化测试来测量应用程序中特定进程中发生的数据库IO数量,并确保它们不会超过某个阈值。
在EF之外,你会:
所以我想知道是否有某种方法可以将这些相同的测量值作为调用DbContext.SaveChanges的一部分。我认为您可以覆盖SaveChangesAsync和SaveChanges方法来执行“set io statistics”语句,但这样做会导致额外的数据库命中,而且在SaveChangesAsync完成后我也不知道如何获取统计信息。
有什么想法或想法吗?
答案 0 :(得分:2)
统计数据消息以Info Messages形式返回,您可以聚合。例如在EF Core中,类似于:
db.Database.OpenConnection();
var con = db.Database.GetDbConnection() as SqlConnection;
db.Database.ExecuteSqlCommand("set statistics io on");
con.InfoMessage += (s, a) =>
{
if (a.Errors[0].Number == 3615)
{
Console.WriteLine(a.Message);
}
};
更好的方法可能是监控服务器。您可以使用XEvents会话捕获logout事件,该事件包含结束(或从连接池重用)的每个会话的摘要统计信息。 EG
CREATE EVENT SESSION [Session Stats] ON SERVER
ADD EVENT sqlserver.logout(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.username))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO