C# SqlConnections 用完了整个连接池

C# SqlConnections using up entire connection pool

我编写了一个偶尔需要非常频繁地轮询数据库的服务。通常我会用 SqlDataAdapter 创建一个新的 SqlConnection 然后像这样开火:

var table = new DataTable();

using(var connection = new SqlConnection(connectionString))
{
    connection.Open();
    using(var adapter = new SqlDataAdapter(selectStatement, connection))
    {
        adapter.Fill(table);
    }
}

但是在负载很重的情况下(可能每周发生一次),服务实际上可能会用完整个连接池,并且服务会记录以下异常。

System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

服务中的多个线程必须访问 SQL 服务器以进行各种查询,我希望尽可能多地并行访问 运行(这显然有时效果太好).

我考虑了几种可能的解决方案:

推荐的程序是什么,或者是否有处理此问题的最佳实践方法?

最终的解决方案并不十分理想(在 SQL 服务器端解决了问题)所以我最终检查了作业排队系统中的并发连接数。

该服务现在不会为文档生成创建另一个线程,除非它可以保证连接池实际可用。 SQL 服务器上的严重瓶颈仍然存在,但该服务现在不再生成异常。

缺点当然是,当 SQL 服务器上执行某些阻塞查询时,队列会变长,这可能会延迟文档生成一两分钟。所以这不是一个理想的解决方案,而是一个可行的解决方案,因为延迟并不重要,因为文档不是直接需要的,而是为了存档目的而存储的。

更好的解决方案是修复它 SQL 服务器端。