在ASP.NET中重复查询时,EFCore查询限制为1000

时间:2019-05-02 15:07:38

标签: c# asp.net-core entity-framework-core

我注意到我的ASP.NET应用程序(导入CSV并将其转换为数据库实体)在某种程度上大大降低了导入过程的速度。

版本信息:EFCore 2.2.3,.NET Core 2.0

在数据库中查询CSV行以检查该实体是否已存在时,似乎卡住了。奇怪的是,到那时为止一切都很好,并且每次几乎都恰好在1000个查询处停止。在这一点之后,会散布一些日志,表明线程正在退出,然后再处理少数几个线程,再次冻结,冲洗并重复。

我一直在研究各种理论,最终将其简化为该示例(它实际上在其自己的线程中运行,但是为了简化示例,我将其移至控制器方法):

Startup.cs

...
// We use an extended DbContext that defines the various DbSets as usual
services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(dbConnectionString));
...

SomeController.cs

private readonly DatabaseContext _context;

public SomeController(DatabaseContext context) 
{
    _context = context;
}

[Route("/SomeController/TestQueries")]
public async Task<JsonResult> TestQueries()
{
    await TestRepeatedQueries();
    return null;
}

private async Task TestRepeatedQueries()
{
    for (var i = 0; i < 10000; i++)
    {
        Debug.WriteLine($"Fetching for iteration {i}");
        _ = await _context.SomeTable.FirstOrDefaultAsync(); // Nothing fancy
        // It doesn't appear that table complexity is a factor
        // The problem occurs even with a simple table with an ID and a few integers
    }
}

点击控制器方法后,日志显示它很轻松地触发,查询数据库约1000次迭代,但随后停止。似乎退出了一些随机工作线程,大约5秒钟后,它又爆炸了约10次迭代,依此类推。

我不确定我在这里缺少什么,几乎似乎正在达到一些查询限制,并且在恢复资源之前需要花费一些时间来释放资源?

如有任何疑问,请询问!

更新

由于某种未知的原因,它又重新开始正常工作-我唯一要做的就是切换到另一个分支以继续工作,并打开该项目的另一个副本以测试我想到的事情。一旦运行示例代码,它就完成了所有10,000次迭代,没有任何问题。

这并不能解释导致问题的原因以及如何重现该问题,但是让我感到某些地方可能存在一些对请求的缓存/缓冲?

1 个答案:

答案 0 :(得分:0)

我相信这与跟踪实体有关。 请参阅:https://docs.microsoft.com/en-us/ef/core/querying/trackingawait _context.SomeTable.AsNoTracking().FirstOrDefaultAsync();应该会有所帮助。 我陷入那种复杂的情况。轨道实体结构增长过多。 另一种方法是限制DBContex实例的操作量。