Малоинтересная деталь в .NET
Класс
OracleCommand
при выполнении запроса
INSERT
выделяет курсор в Oracle, который не освобождает при вызове
Dispose()
.
OracleCommand cmd = new OracleCommand("INSERT INTO ...", connection);
try
{
cmd.ExecuteNonQuery();
}
finally
{
cmd.Dispose();
}
При многократном выполнении приведённого куска в цикле у Oracle быстро кончается пул курсоров, что приводит к ошибке
ExecuteNonQuery()
. Выделенные курсоры можно подсмотреть с помощью запроса
select user_name, status, osuser, machine, a.sql_text from v$session b, v$open_cursor a where a.sid = b.sid
Высвободить курсор(ы) помогает принудительная сборка мусора:
cmd = null;
System.GC.Collect();