Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net OracleCommand内存泄漏_.net_Oracle - Fatal编程技术网

.net OracleCommand内存泄漏

.net OracleCommand内存泄漏,.net,oracle,.net,Oracle,我正在使用ODP.Net 11.1.0版将数据插入数据库,我发现内存泄漏。如果我注释掉下面的代码,它就会消失。这段代码在我的应用程序中被调用了数千次,我可以看到所有堆中的字节在运行时稳步增长。cmdStr包含一个insert语句,该语句插入到包含375列的表中。除了两个字段外,所有字段都是数字-一个是日期,另一个是VARCHAR2(20)。我还需要做些什么来清理OracleCommand?此处不会引发异常-insert命令每次都会成功 编辑:我尝试移动return语句,但没有达到预期效果-使用t

我正在使用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要保留这些

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”没有得到处理。