Утечка памяти в ODP.NET при использовании UDT: s - PullRequest
1 голос
/ 21 марта 2012

При использовании загрузки данных ODP.NET и пространственной базы данных я использую UDT для определения типа SDOGEOMETRY.

Затем я использую ArrayBindCount в OracleCommand для загрузки пакетов данных.Все работает, но я вижу постоянное увеличение памяти процесса, и счетчики производительности показывают то же самое.

Параметр создается с помощью:

var param = new OracleParameter("geom", OracleDbType.Object);
param.UdtTypeName = "MDSYS.SDO_GEOMETRY";
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param);

Также я устанавливаю cmd.AddToStatementCache = false, чтобы предотвратить попадание данных там ..

При добавлении данных я использую: param.Value = новый объект [numRowsToInsert];

int row = 0;
foreach (var row in rowstoinsert)
{
  OracleUDT.SdoGeometry geoVal = rowstoinsert[row].geom;
  (param.Value as object[])[row] = geoval;
}

...

cmd.ExecuteNonQuery();   //THIS IS WHERE MEMORY LEAK APPEARS TO BE

..

Я попытался запустить программу с удаленным ExecuteNonQuery (), и затем вообще не было MemoryLeakage ....

Редактировать: Я также попытался удалить параметр UDT и запустить программу, также без каких-либо утечек.Похоже, что проблема очень тесно связана с UDT: s и когда выполняются операторы.

Я использую ODP.NET 11.2.0.2.1

Кто-нибудь получил какие-либо подсказки?Есть ли что-то, что мне нужно очистить, что не создается, если не выполняется ExecuteNonQuery ()?

1 Ответ

0 голосов
/ 01 апреля 2013

Думаю, я бы продолжил этот вопрос. После многочисленных писем с технической поддержкой Oracle я, наконец, принял это как ошибку

Похоже, это ошибка 10157396, исправленная в 12.1, которую планируется исправить в 11.2.0.4 и перенесенная в 11.2.0.2 (доступна в Пакете исправлений 18). Его можно загрузить из MyOracleSupport в виде исправлений 10098816 (11.2.0.2) и 13897456 (Bundle 18) для временного решения, пока мы возвращаемся к 11.2.0.3 или до выпуска 11.2.0.4.

...