当使用ODP.NET加载数据到空间数据库时,我使用UDT来定义SDOGEOMETRY类型。使用UDT时ODP.NET内存泄漏:s
然后我使用OracleCommand上的ArrayBindCount来加载批量的数据。一切正常,但我看到的进程的内存不断增加,和性能计数器显示了同样的事情..使用创建
参数:
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 = new object [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()不会创建?
ExecuteNonQuery方法执行所有ADO.NET工作(通过ODP.NET提供程序),因此不执行会导致泄漏。你是否正确地打开,关闭和处理各种ADO.NET对象(连接和命令)? – 2012-03-21 17:26:20
我相信如此,运行代码WITH插入但忽略UDT列(但保留其他17列)不会泄漏内存... 命令被清理为: cmd.Connection.PurgeStatementCache(); cmd.ArrayBindCount = 0; (int i = 0; i
Peter
2012-03-22 06:55:35
听起来像你正在做正确的事情。下一步是使用[WinDbg]验证.NET中的内存泄漏(http://blogs.msdn.com/b/johan/archive/2007/11/13/getting-started-with-windbg-part-i的.aspx)。不幸的是,这是一个非常令人畏惧的工具来设置和使用。当应用程序泄漏内存时创建应用程序的内存转储。在WinDbg中加载并为.NET配置后,运行!dumpheap -type“UDT columnn type”,其中您将实际的ODP.NET类型用于UDT columnn类型。如果有很多实例弹出,那么很可能它们位于垃圾收集根链中。 – 2012-03-22 12:55:10