【问题标题】:Oracle Connections not closing with Using Clause [duplicate]Oracle 连接未使用使用子句关闭 [重复]
【发布时间】:2017-11-27 23:20:13
【问题描述】:

即使我像下面这样重写代码,Oracle 连接也不会关闭。我有 3 种类型的 Oracle 连接,如 DataReader、DataAdapter 和 Normal。

我错在哪一部分?

Type:1 - Datareader 连接

using (OracleConnection con = new OracleConnection(oradb))
                {
                    con.Open();

                    using (OracleCommand cmd1 = new OracleCommand("select  sql_fulltext \"SQL Text\" from gv$sqlarea where rownum<2 and sql_id='" + sqlid + "'", con))
                    {
                        OracleDataReader dr1 = cmd1.ExecuteReader();
                        dr1.Read();
                        rtbSQLDetails.Text = dr1.GetString(0);
                    }

                }

类型:2 数据适配器连接

using (odagetInstID = new OracleDataAdapter("select distinct INST_ID from gv$instance where status='OPEN'", oradb))
                {
                    odagetInstID.Fill(dtInstID);
                } 

类型:3 个普通连接

using (var con = new OracleConnection(oradb))
            {
                con.Open();
               //...
}

【问题讨论】:

  • 一些提供商故意保留底层连接的内部池,以减少打开连接时的延迟。这意味着 底层 连接将比DbConnection 实例寿命更长。 SqlClient当然会这样做。 OracleConnection 是否可能只是在做同样的事情?如果是这样,您可以可能禁用连接字符串中的池,但这通常是个坏主意。编辑:“使用连接池”部分here 听起来很可能。
  • 对于速度和/或缓存,我认为这就是您所看到的......您现有的代码没有问题。更不用说如果代码被多次调用,在离开 using(){ } 代码块时将创建新实例然后 Disposed 。如果您的代码存在打开连接问题,则有关已打开连接的 Oracle 异常肯定会引发错误。

标签: c# winforms


【解决方案1】:

“使用”关闭意味着在循环结束时“处置”。但是,Microsoft 建议明确调用 close。

另见... Close and Dispose - which to call? (第二个答案给出了几乎完全相同的场景)

【讨论】:

  • 不,除了Dispose 之外,没有理由显式调用Close。建议您做一个或另一个,而不是等待对象自行清理自己的资源。
  • @Servy 在实践中我完全不同意。在垃圾收集和连接池之间,此连接将保持打开状态。明确关闭数据库连接应该会产生预期的结果并防止来自同一台机器的大量新连接。
  • 是的,using 正是这样做的。这就是它的全部目的。声称 using 没有明确关闭资源实际上是错误的,甚至在您自己的链接中也有说明。您个人不同意已证实的事实并没有任何意义。这不是您可以不同意的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2017-01-31
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多