首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OracleCommand导致的内存泄漏

OracleCommand导致的内存泄漏
EN

Stack Overflow用户
提问于 2009-02-19 14:59:00
回答 6查看 3.8K关注 0票数 2

我正在使用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要把这些留在身边?

代码语言:javascript
复制
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;
}
EN

回答 6

Stack Overflow用户

发布于 2009-02-20 21:34:26

尝试用OracleConnection将using语句包装在using语句中,如下所示:

代码语言:javascript
复制
try
{
    using (OracleConnection conn = new OracleConnection(connectionString))
    {
        using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
        {
        ....
        }
    }
}
catch (OracleException e)
{
  ....
}

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

票数 4
EN

Stack Overflow用户

发布于 2009-02-19 15:07:42

尝试将其重新构建为类似以下内容:

代码语言:javascript
复制
  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
票数 1
EN

Stack Overflow用户

发布于 2009-02-20 21:25:09

你的连接保持畅通吗?每次需要发出这个命令时,尝试打开一个新的连接(无论如何它都是池化的,所以它不会影响性能),在完成事务后关闭并处理它,看看内存泄漏是否消失了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/565681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档