gpt4 book ai didi

.net - OracleCommand 内存泄漏

转载 作者:行者123 更新时间:2023-12-02 09:01:55 26 4
gpt4 key购买 nike

我正在使用 ODP.Net 版本 11.1.0 将数据插入数据库,但发现内存泄漏。如果我注释掉下面的代码,它就会消失。这段代码在我的应用程序中被调用了数千次,并且我可以看到所有堆中的字节数随着它的运行而稳定增长。 cmdStr 包含一个插入语句,该语句插入到具有 375 列的表中。除两个字段外,所有字段均为 NUMBER - 一个是 DATE,另一个是 VARCHAR2(20)。我还需要做些什么来清理 OracleCommand 吗?这里没有抛出任何异常 - 插入命令每次都会成功。

编辑:我尝试移动 return 语句,但这没有达到预期的效果 - 使用实际上是一个 try-finally block 。

更新:我使用 CLRProfiler 来查看什么占用了内存,它是一堆字符串对象,大约有 2800 个。它们的引用由 HashTable 对象保存,这些对象属于Oracle.DataAccess.Client.ConnDataPool 对象。为什么 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;
}

最佳答案

尝试将带有 OracleConnection 的 using 语句包装在 using 语句周围,如下所示:

try
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
{
....
}
}
}
catch (OracleException e)
{
....
}

这将尽快删除 OracleConnection 对象——即使在 using 语句中出现 OracleException 时也是如此。

关于.net - OracleCommand 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/565681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com