我注意到我的ASP.NET应用程序(导入CSV并将其转换为数据库实体)在某种程度上大大降低了导入过程的速度。
版本信息:EFCore 2.2.3,.NET Core 2.0
在数据库中查询CSV行以检查该实体是否已存在时,似乎卡住了。奇怪的是,到那时为止一切都很好,并且每次几乎都恰好在1000个查询处停止。在这一点之后,会散布一些日志,表明线程正在退出,然后再处理少数几个线程,再次冻结,冲洗并重复。
我一直在研究各种理论,最终将其简化为该示例(它实际上在其自己的线程中运行,但是为了简化示例,我将其移至控制器方法):
...
// We use an extended DbContext that defines the various DbSets as usual
services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(dbConnectionString));
...
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次迭代,没有任何问题。
这并不能解释导致问题的原因以及如何重现该问题,但是让我感到某些地方可能存在一些对请求的缓存/缓冲?
答案 0 :(得分:0)
我相信这与跟踪实体有关。
请参阅:https://docs.microsoft.com/en-us/ef/core/querying/tracking。
await _context.SomeTable.AsNoTracking().FirstOrDefaultAsync();
应该会有所帮助。
我陷入那种复杂的情况。轨道实体结构增长过多。
另一种方法是限制DBContex
实例的操作量。