2012-03-21 125 views
1

当使用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()不会创建?

+0

ExecuteNonQuery方法执行所有ADO.NET工作(通过ODP.NET提供程序),因此不执行会导致泄漏。你是否正确地打开,关闭和处理各种ADO.NET对象(连接和命令)? – 2012-03-21 17:26:20

+0

我相信如此,运行代码WITH插入但忽略UDT列(但保留其他17列)不会泄漏内存... 命令被清理为: cmd.Connection.PurgeStatementCache(); cmd.ArrayBindCount = 0; (int i = 0; i Peter 2012-03-22 06:55:35

+0

听起来像你正在做正确的事情。下一步是使用[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

回答

0

想到我会对此进行跟进。 经过多次电子邮件与Oracle技术支持我终于得到这个接受作为一个错误

这似乎是错误10157396已修复12.1,计划在11.2.0.4固定,并已回溯到11.2.0.2 (在Patch Bundle 18中可用)。这可以从MyOracleSupport作为补丁10098816(11.2.0.2)和13897456(Bundle 18)下载,以获得临时解决方案,同时我们获取到11.2.0.3的回送端或直到11.2.0.4发布。