使用UDT:s时发生ODP.NET内存泄漏

本文关键字:ODP NET 内存 泄漏 UDT 使用 | 更新日期: 2023-09-27 18:28:27

当使用ODP.NET将数据加载到空间数据库时,我使用UDT来定义SDOGEOMETRY类型。

然后,我在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以防止数据最终出现在其中。。

添加数据时,我使用:参数。值=新对象[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(),我是否需要清理一些没有创建的东西?

使用UDT:s时发生ODP.NET内存泄漏

我想跟进一下。在与Oracle技术支持部门的多次电子邮件之后,我终于将其作为错误接受了

这似乎是Bug 10157396,已在12.1中修复,计划在11.2.0.4中修复,并已向后移植到11.2.0.2(可在补丁包18中获得)。这可以作为临时解决方案的补丁10098816(11.2.0.2)和13897456(捆绑包18)从MyOracleSupport下载,同时我们可以获得11.2.0.3或11.2.0.4发布之前的后台端口。