当使用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以防止数据在那里结束..
添加数据时我使用: 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(),是否需要清理哪些不会被创建?
答案 0 :(得分:0)
以为我会对此进行跟进。 在经过Oracle Tech-Support的大量电子邮件之后,我终于将其视为一个错误
这似乎是Bug 10157396,它在12.1中被修复,计划在11.2.0.4中修复并且已经被后移到11.2.0.2(在Patch Bundle 18中可用)。这可以从MyOracleSupport作为补丁10098816(11.2.0.2)和13897456(Bundle 18)下载,以获得临时解决方案,同时我们得到一个backport到11.2.0.3或直到11.2.0.4发布。