如果还有对它们的引用将汇集SQL连接被清理?(Will pooled SQL Connections

2019-09-23 06:20发布

@usr和我在另外的一个问题争执有关.NET是否会清除已被闲置的开放连接,但仍保持保持的基准。

我维护, 基于文档 ,如果物理连接是闲置了一段时间,这将是一个周期,即使一段时间后回收SQLConnection对象引用仍然保持。

USR声称,这不会发生,而且只回收不再有引用连接。 他作为这个论断会使连接池不可靠的,并会造成严重破坏交易。

我承认,该文件是语焉不详举行引用的问题。

我在寻找这一权威的答案,而不是只是猜测。 要么有人已经尝试和验证这两种情况下,或与内部运作的知识的人。

那么是哪一个呢?

编辑:

我认为这里的混乱是“关闭”的术语。 这似乎是此案的文件指的是关闭的“删除”了从池连接的物理连接。 虽然“合”是指释放开物理连接放回池中进行再利用。

打开的连接仍然可以中止,但如果它是否仍持有由客户端应用程序开放池程序,标志着这是无效的,目前还不清楚(即客户端应用程序还没有叫紧密中止连接上)不知道它真的很重要,虽然,比其他为池计数的一部分。

Answer 1:

我可以告诉你100%的把握,连接返回到池中,直到释放。 我有一个会话创建一个临时表,离开它,而等待用户输入挂。 用户回来后6分钟,按下一个按钮,它继续在同一SPID和生活在继续对临时表。

应用逻辑,因为你能想象的严重破坏,如果你失去了SPID只是因为你已经空闲了X分钟它是有道理的? 如果你保持不必“平”的SQL Server的命令,只是为了保持它活着? ( 这将是疯狂


你似乎是混淆概念2。 当连接关闭时,它返回到池中。 如果超出范围,则隐含地关闭 - >返回到池中。 到“空闲”的提法是指当池中的连接变得空闲,而不是当它被主动地引用,而不是关闭 。 所保持的连接是连在游泳池有资格获得任何类型的清除作用。 从池中释放资源是有道理的,因为一个web应用程序可以很容易爆的连接100S,然后在几个月停留在大约20个左右的主动并发连接未来。



Answer 2:

.NET是否会清除已被闲置的开放连接,但仍保持基准举行

该“保持的基准”是在这里并不重要,关键是“开放”。 要正确地回收,你需要一个连接Dispose()Close()它。



Answer 3:

我只是跑下面的程序:

        var conn = new SqlConnection("...");
        conn.Open();
        conn.ExecuteNonQuery("select null");
        Thread.Sleep(TimeSpan.FromMinutes(11));
        conn.ExecuteNonQuery("select null");

它跑通过成功(使用自定义的辅助方法,所以你不能直接运行)。

这并不能证明当然的事情(只要它没有正常运行)。 反射显示,池6.5min以及此后每隔30s后清理第一次:

private Timer CreatePruningTimer()
{
    return new Timer(new TimerCallback(this.PruneConnectionPoolGroups), null, 240000, 30000);
}

所以这个测试应该已经暴露出来的问题。

现在,在文档中的句子也不是特别清楚。 它没有提到GC甚至对象引用(在你的问题,你说是这样,但事实并非如此)。

连接池程序定期扫描连接池寻找一个没有被关闭或处置关闭未使用的连接,并回收这些发现。 如果应用程序没有明确关闭或它的连接配置,它可以采取相当一段时间的的连接池收回他们,所以最好以确保您显式调用关闭,并在您的连接进行处理。

我不相信它。 在贝叶斯来说的,微软文档是有力的证据,但如果有强有力的反证据,可以得出相反的结论。

我有以下证据表明,开放式的连接不是没有理由关闭:

  1. 这将注入不属于预防(仅重试)随机故障
  2. 这将中止是蛮好的交易
  3. 它将使长期运行的事务不可能
  4. 我看不出一个原因,这种行为应该是这样的
  5. 在该文档中的句子可以以下面的方式来解释:在池还定期回还没有被关闭的连接,但其相应的SqlConnection对象已经GC'ed(检测,通过使用一个或的WeakReference东西)。 我想微软文档作家意味着,或者不明白的问题(合理的!)
  6. 测试中没有说明问题
  7. 如何SSMS管理运行长达一小时的疑问? SSMS应该受到同样的限制


文章来源: Will pooled SQL Connections be scavenged if there is still a reference to them?