使用多个 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 as 中做锁

    Parallel.ForEach(dt.Rows.Cast<DataRow>(),options,(trans) => {
        var obj=new object();
    lock(obj)
            {
            //...your processing
            }
        });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...