c# - 使用多个 Datareader 连接进行批处理
问题描述
我有一个超过 100000 条记录的表。我想读取数据,处理它们,然后如果处理成功则删除该行,如果失败则使用错误代码更新该行。
我的方法是一次获取 1000 条记录,将其加载到数据表中,然后将其传递给在 5 个并行线程中运行进程的函数。处理完前 1000 条记录后,打开一个新的 DataReader 并处理接下来的 1000 条……依此类推……
我的方法看起来对吗?我遇到的问题是代码运行良好,但 1000 条记录没有完全处理。处理了大约 300 条记录,其余的仍然存在。我在这里做错了什么?
using (SqlDataReader rdr = cmd.ExecuteReader) {
if (rdr.HasRows) {
Datatable dt = new Datatable();
dt.Load(rdr);
//process data
results = Process(dt);
}
}
public List<string> Process(Datatable dt) {
var options = new ParallelOptions() {
MaxDegreeOfParallelism = 5
}
List<string> results = new List<string>();
Parallel.ForEach(dt.Rows.Cast<DataRow>(), options, (trans) => {
//process and then delete/update row
....
results.Add(transResult);
});
return results
}
解决方案
线程共享相同的资源,因此会导致 dbContext 出现问题。所以最好将 Parallel.ForEach 锁定为
Parallel.ForEach(dt.Rows.Cast<DataRow>(), options, (trans) => {
var obj=new object();
lock(obj)
{
//...your processing
}
});
推荐阅读
- retrofit2 - 带有 okhttp 4 的库会破坏使用改造 2 的代码
- java - 如何使用 XSD/JAXB 2.1 生成私有列表属性
- cordova - 'ECONNREFUSED' 对 http 请求
- python - 如何在pycharm中添加依赖来读取Avro?
- javascript - 为什么在外部范围内等待内联变量与简单的等待分配不同?
- c - 将结构保存到文件中,然后在同一个程序中读取它
- reporting-services - 数量和外部价格乘以三?
- javascript - 如何在 GTM 中使用自定义变量
- dart - 如何在服务器的 dart 中实现 grpc 拦截器?
- r - 我们如何在 R 的多线图中混合线型?