我们使用存储过程从数据库中导出一些数据。我们传递ID列表并返回相应的记录。通常,有2百万个ID传递给SP,为了减少负载,我们将ID分解为批次。每批有2000个ID。
然后我们在一个循环中调用该SQL Server存储过程,每次循环运行时,5个并发线程传递它们的ID(每个2000个ID)等。这曾经很好地工作但是最近它已经开始崩溃了通过返回此错误指出:读取器关闭时无效尝试调用读取
我已将DbContext的CommandTimeOut属性增加到int.Max,并且我已禁用LazyLoading(我正在调用.ToList以确保获取集合)。在进行这些更改后,事情变得更好,但在导出1,400,000条记录(200万条记录)后,操作仍然失败。
以下是并发线程运行的代码:
public List<ExportedData> GetDownloads(IEnumerable<int> downloadIds)
{
var results = new List<ExportedData>();
using (var dbc = new DefaultEntities())
{
dbc.CommandTimeout = CommandTimeOut;
dbc.ContextOptions.LazyLoadingEnabled = false;
results.AddRange(dbc.ExportDownloads(string.Join(";", downloadIds), true).ToList());
dbc.Connection.Close();
}
return results;
}
造成这个问题的原因是什么?