Во время выполнения ExecuteNonQueryAsync()
на некоторой итерации выдается ошибка:
не может получить доступ к удаленному объекту.
Большой файл со 100 миллионами строк читается и вставляется пакетами в БД.
Все выполнение происходит в одной транзакции, поскольку, если какие-либо данные являются ненужными, нам необходимо откатить всю транзакцию.
Итак, соединение с БД остается активным до завершения транзакции.
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();
}
}