C#SqlConnections耗尽整个连接池

时间:2018-02-08 07:43:24

标签: c# multithreading sqlconnection

我写了一个偶尔必须经常轮询数据库的服务。通常我会使用SqlConnection创建一个新的SqlDataAdapter并像这样开火:

var table = new DataTable();

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

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

  

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

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

我想到了几种可能的解决方案:

  • 我考虑过增加连接池大小,但这可能会延迟问题。
  • 然后我想到为服务使用单个连接并保持打开服务的其余部分,这可能是一个简单的选项,但是即使没有工作量要做,它也会保持连接打开必须处理由服务器等连接重置,我不知道效果。
  • 最后我考虑实现我自己的那种管理并发连接数的池,并保持线程保持不变,直到有空闲插槽。

建议的程序是什么或者是否有最佳的处理方法?

1 个答案:

答案 0 :(得分:1)

最终解决方案并不完全理想(在SQL Server端修复问题)所以我最终检查了作业排队系统中的并发连接数。

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

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

更好的解决方案是修复SQL Server端。