OracleCommand 内存泄漏

2023-12-29

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

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

更新:我使用 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 时也是如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OracleCommand 内存泄漏 的相关文章