我正在使用ODP.Net版本11.1.0将数据插入到数据库中,我发现了一个内存泄漏。如果我注释掉下面的代码,它就消失了。这段代码在我的应用程序中被调用了数千次,我可以看到所有堆中的字节数随着它的运行而稳步增长。cmdStr包含一条insert语句,可插入到包含375列的表中。除了两个字段之外,所有字段都是数字-一个是日期,另一个是VARCHAR2(20)。我还需要做些什么来清理OracleCommand吗?这里没有抛出异常- insert命令每次都是成功的。
编辑:我试着移动return语句,但没有产生预期的效果-- using实际上是一个try-finally块。
更新:我使用了CLRProfiler来查看是什么在消耗内存,它是一堆string对象,大约有2800个。它们的引用由Oracle.DataAccess.Client.ConnDataPool对象所拥有的HashTable对象持有。为什么ODP.NET要把这些留在身边?
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;
}发布于 2009-02-20 21:34:26
尝试用OracleConnection将using语句包装在using语句中,如下所示:
try
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
{
....
}
}
}
catch (OracleException e)
{
....
}这将尽快消除OracleConnection对象--即使在using语句中出现OracleException也是如此。
发布于 2009-02-19 15:07:42
尝试将其重新构建为类似以下内容:
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发布于 2009-02-20 21:25:09
你的连接保持畅通吗?每次需要发出这个命令时,尝试打开一个新的连接(无论如何它都是池化的,所以它不会影响性能),在完成事务后关闭并处理它,看看内存泄漏是否消失了。
https://stackoverflow.com/questions/565681
复制相似问题