在我继续解释该问题之前,需要一点背景知识。
我有一个记录日志的机制
因此,我创建了一个简单的“ AllowAnonymous” MVC操作方法,该方法运行一个简单的实体框架查询。我将其推送到我们的DEV服务器,然后转到浏览器并调用该Action Method。检查日志,我看到1个Http请求和1个查询已执行。完美!
[AllowAnonymous]
public ActionResult GetInvoiceById(int InvoiceId)
{
JsonResult mJson = new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet };
try
{
var inv = GetInvoice(InvoiceId);
mJson.Data = inv;
}
catch (Exception ex)
{
throw;
}
return mJson;
}
public InvoiceViewModel GetInvoice(int InvoiceId)
{
var inv = Context.Invoices.Where(m => m.InvoiceId == InvoiceId)
.Select(s => new InvoiceViewModel()
{
InvoiceId = s.InvoiceId,
StatusId = s.StatusId,
AttachmentTypeId = s.TypeId,
ContentId = s.ContentId,
CreatedDate = s.CreatedDate,
UpdatedDate = s.UpdatedDate
}).FirstOrDefault();
return inv ?? new InvoiceViewModel();
}
现在,我想对该动作方法进行负载测试。我为此使用了Netling。
所以我在1个线程上进行了60秒的负载测试。因此,它会连续60秒钟调用action方法。这是测试结果。
Netling报告(我从我的日志中确认)它运行了 345 个请求。 但是,Entity Framework运行查询的次数是 399 次。因此,以某种方式,Entity Framework对于少数请求运行查询一次以上。我一次只打一个电话,除了我之外,DEV服务器上没有任何人。
其他说明,我有时看到EF已打开和关闭的连接数等于请求的数量,有时它们等于查询执行的次数。但是,每当我进行负载测试时,查询执行的次数就会超过请求的次数。如果增加线程数,请求数和查询执行数之间的差距也会增加。
我的问题是,如果不是很明显,请求数( 345 )应该与查询执行的次数( 399 )相匹配。但事实并非如此,这意味着对于某些请求,查询将执行多次。为什么?我该如何解决?