ExecuteNonQueryAsync()
运行时,它在某些迭代中给出了错误:
无法访问已处置的对象。
正在读取一个具有1亿行的大文件,并将其批量插入DB。
所有执行都在单个事务中进行,因为如果有任何数据垃圾,我们需要回滚整个事务。
因此,数据库连接将保持活动状态,直到事务完成为止。
List<Task> insert = new List<Task>();
public void InsertDataToDB(string generatorRunId)
{
{
// some logic
// loop runs million times and task is added to list
insert.Add(Task.Run(() => ExecuteOracleCommandAsync(schemaTable, oraConn, insertString, obj, param)));
}
Task.WhenAll(insert).Wait();
}
private static async Task ExecuteOracleCommandAsync(DataTable schemaTable, OracleConnection oraConn, string insertString, object[][] obj, OracleParameter[] param)
{
using (OracleCommand cmd = oraConn.CreateCommand())
{
cmd.CommandText = string.Concat(insertString, ")");
cmd.ArrayBindCount = obj[0].Length;
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
cmd.Parameters.Add(param[i]);
}
await cmd.ExecuteNonQueryAsync();
}
}