【问题标题】:Why does this code exhaust the connection pool so quickly?为什么这段代码这么快就耗尽了连接池?
【发布时间】:2019-09-13 19:35:10
【问题描述】:

我正在尝试使用以下代码测试我与 Sql Server 数据库的连接。它所做的只是尝试在后台任务中打开连接,超时 5 秒:

private bool CanConnect()
{
    //we'll give it 5 seconds to connect
    var timeout = TimeSpan.FromSeconds(5);

    var connectSuccess = Task.Run(() =>
    {
        try
        {
          //the connection
          using (var connection = new SqlConnection(ConnectionString))
          {
             connection.Open();
          }
        }
        catch { }
    }).Wait(timeout);

    //return status
    return connectSuccess;
}

但是当我这样做时,我很快就会得到错误

System.InvalidOperationException: '超时已过期。超时 从池中获取连接之前经过的时间。这 可能已经发生,因为所有池连接都在使用中并且最大 已达到池大小。'

这总是在第 4 次连接尝试时发生,这令人费解,因为默认池大小为 100。

但我完全不明白为什么会发生这种情况,因为我正在处理与 using 块的连接。那么为什么我没有可用的连接,而且这么快呢?

【问题讨论】:

  • 你能给我们你的连接字符串(ofc 没有显示凭据)
  • 您提供的代码并不能证明:1)它发生在第四次连接上; 2)池中最大连接的默认值不是由连接字符串重新定义的,3)在请求另一个连接之前,连接被返回到池中。

标签: c# multithreading ado.net sqlconnection


【解决方案1】:

连接池中使用的连接仅在被垃圾收集后返回到池中。

但我无法理解(从我看到的代码中)为什么你会耗尽你的池。为什么不使用数据库连接超时?

【讨论】:

  • 因为讨论了here 的注意事项。无论 ConnectionTimeout 设置如何,失败都可能需要相当长的时间,我希望失败得更快。
  • 这会导致其他问题,也许是网络问题得到了解决......我个人认为这是矫枉过正。
  • 否,在 IDisposable 上触发 Dispose 方法时,使用范围结束后连接丢失。垃圾收集器不调用 Dispose 方法并保持连接打开。 OP 正在使用“使用”,因此连接已关闭,我猜他的环境中存在其他一些网络问题
猜你喜欢
  • 2011-05-27
  • 2016-09-17
  • 2023-04-06
  • 1970-01-01
  • 2021-05-29
  • 2016-02-16
  • 2014-09-14
  • 1970-01-01
相关资源
最近更新 更多