Ошибка: невозможно получить доступ к удаленному объекту.Имя объекта: Oracle.ManagedDataAcess.Client.OracleCommand - PullRequest
0 голосов
/ 12 декабря 2018

Во время выполнения 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();
    }
}
...