Я использую ODP.Net версии 11.1.0 для вставки данных в базу данных, и я вижу утечку памяти. Если я прокомментирую приведенный ниже код, он исчезнет. Этот код называется тысячами раз в моем приложении, и я могу наблюдать за количеством байтов во всех кучах, которые постоянно растут. cmdStr содержит инструкцию insert, которая вставляет в таблицу с 375 столбцами. Поля - всего NUMBER, за исключением двух - один - ДАТА, а другой - VARCHAR2 (20). Есть ли что-то еще, что мне нужно сделать, чтобы очистить OracleCommand? Здесь нет исключений - команда вставки успешно выполняется каждый раз.Утечка памяти с OracleCommand
Редактировать: Я попытался переместить оператор return, и это не имело никакого эффекта, как ожидалось, - это действительно блок try-finally.
Обновление: Я использовал CLRProfiler, чтобы узнать, что использует память, и это куча строковых объектов, из которых 2800. Их ссылки хранятся объектами HashTable, принадлежащими объектам Oracle.DataAccess.Client.ConnDataPool. Почему ODP.NET поддерживает их?
try
{
using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
{
cmd.CommandTimeout = txTimeout;
int nRowsAffected = cmd.ExecuteNonQuery();
errMsg = null;
return EndpointResult.Success;
}
}
catch (OracleException e)
{
return BFOracleAdapter.HandleOracleException(e, out errMsg);
}
catch (Exception e)
{
errMsg = "OracleInsertOperation Exception: " + e.Message;
return EndpointResult.Error;
}
Все выглядит хорошо в этом коде. Вопросы: 1. Правильно ли вы используете объект OracleConnection? 2. Что находится в строках, которые вы видите в CLRProfiler? Как взломать, я думаю, что есть способ закрыть/сбросить все соединения в пуле соединений ... – ConsultUtah