.net OracleCommand内存泄漏
我正在使用ODP.Net 11.1.0版将数据插入数据库,我发现内存泄漏。如果我注释掉下面的代码,它就会消失。这段代码在我的应用程序中被调用了数千次,我可以看到所有堆中的字节在运行时稳步增长。cmdStr包含一个insert语句,该语句插入到包含375列的表中。除了两个字段外,所有字段都是数字-一个是日期,另一个是VARCHAR2(20)。我还需要做些什么来清理OracleCommand?此处不会引发异常-insert命令每次都会成功 编辑:我尝试移动return语句,但没有达到预期效果-使用try-finally块实际上是一个try-finally块 更新:我使用CLRProfiler来查看是什么耗尽了内存,这是一堆字符串对象,大约2800个。它们的引用由拥有它们的哈希表对象持有 Oracle.DataAccess.Client.ConnDataPool对象。为什么ODP.NET要保留这些.net OracleCommand内存泄漏,.net,oracle,.net,Oracle,我正在使用ODP.Net 11.1.0版将数据插入数据库,我发现内存泄漏。如果我注释掉下面的代码,它就会消失。这段代码在我的应用程序中被调用了数千次,我可以看到所有堆中的字节在运行时稳步增长。cmdStr包含一个insert语句,该语句插入到包含375列的表中。除了两个字段外,所有字段都是数字-一个是日期,另一个是VARCHAR2(20)。我还需要做些什么来清理OracleCommand?此处不会引发异常-insert命令每次都会成功 编辑:我尝试移动return语句,但没有达到预期效果-使用t
try
{
using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
{
cmd.CommandTimeout = txTimeout;
int nRowsAffected = cmd.ExecuteNonQuery();
errMsg = null;
return EndpointResult.Success;
}
}
catch (OracleException e)
{
return BFOracleAdapter.HandleOracleException(e, out errMsg);
}
catch (Exception e)
{
errMsg = "OracleInsertOperation Exception: " + e.Message;
return EndpointResult.Error;
}
尝试将return语句移到using块之外。尝试将其重新构造为类似以下内容:
object o;
using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
{
try
{
cmd.CommandTimeout = txTimeout;
int nRowsAffected = cmd.ExecuteNonQuery();
errMsg = null;
o = EndpointResult.Success;
}
catch (OracleException e)
{
o = BFOracleAdapter.HandleOracleException(e, out errMsg);
}
catch (Exception e)
{
errMsg = "OracleInsertOperation Exception: " + e.Message;
o = EndpointResult.Error;
}
finally
{
// clean up
}
}
return o
你保持连接畅通吗?每次需要发出此命令时,请尝试打开一个新连接(无论如何,它都是池连接,因此不会影响性能),完成事务后关闭并处理它,然后查看内存泄漏是否消失。尝试将using语句与OracleConnection包装在using语句周围,如下所示:
try
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
{
....
}
}
}
catch (OracleException e)
{
....
}
这将尽快删除OracleConnection对象,即使在using语句中发生OracleException时也是如此。连接池上的最大连接数是多少?默认情况下,连接池最多启用100个连接
您不显示创建/处理连接的代码部分。我怀疑这更可能是发现问题的地方。尝试使用:Oracle.ManagedDataAccess.Client而不是Oracle.DataAccess.Client。这段代码中的一切看起来都很好。问题:1。您是否正确处理OracleConnection对象?2.在CLRProfiler中可以看到字符串中的内容是什么?作为黑客,我认为有一种方法可以关闭/重置连接池中的所有连接…无论你如何退出,使用都会清理。问题可能是“conn”没有得到处理。