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 服务器以进行各种查询,我希望尽可能多地并行访问 运行(这显然有时效果太好).
我考虑了几种可能的解决方案:
- 我考虑过增加连接池的大小,但这可能只会延迟问题的出现。
- 然后我考虑为该服务使用单个连接并在服务的其余部分保持该连接打开 运行ning,这可能是一个简单的选择,但它会保持连接打开,即使有没有工作要做,并且必须处理服务器等的连接重置,我不知道其影响。
- 最后我想到了实现我自己的一种池来管理并发连接的数量并保持线程在有空闲插槽之前保持暂停状态。
推荐的程序是什么,或者是否有处理此问题的最佳实践方法?
最终的解决方案并不十分理想(在 SQL 服务器端解决了问题)所以我最终检查了作业排队系统中的并发连接数。
该服务现在不会为文档生成创建另一个线程,除非它可以保证连接池实际可用。 SQL 服务器上的严重瓶颈仍然存在,但该服务现在不再生成异常。
缺点当然是,当 SQL 服务器上执行某些阻塞查询时,队列会变长,这可能会延迟文档生成一两分钟。所以这不是一个理想的解决方案,而是一个可行的解决方案,因为延迟并不重要,因为文档不是直接需要的,而是为了存档目的而存储的。
更好的解决方案是修复它 SQL 服务器端。
我编写了一个偶尔需要非常频繁地轮询数据库的服务。通常我会用 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 服务器以进行各种查询,我希望尽可能多地并行访问 运行(这显然有时效果太好).
我考虑了几种可能的解决方案:
- 我考虑过增加连接池的大小,但这可能只会延迟问题的出现。
- 然后我考虑为该服务使用单个连接并在服务的其余部分保持该连接打开 运行ning,这可能是一个简单的选择,但它会保持连接打开,即使有没有工作要做,并且必须处理服务器等的连接重置,我不知道其影响。
- 最后我想到了实现我自己的一种池来管理并发连接的数量并保持线程在有空闲插槽之前保持暂停状态。
推荐的程序是什么,或者是否有处理此问题的最佳实践方法?
最终的解决方案并不十分理想(在 SQL 服务器端解决了问题)所以我最终检查了作业排队系统中的并发连接数。
该服务现在不会为文档生成创建另一个线程,除非它可以保证连接池实际可用。 SQL 服务器上的严重瓶颈仍然存在,但该服务现在不再生成异常。
缺点当然是,当 SQL 服务器上执行某些阻塞查询时,队列会变长,这可能会延迟文档生成一两分钟。所以这不是一个理想的解决方案,而是一个可行的解决方案,因为延迟并不重要,因为文档不是直接需要的,而是为了存档目的而存储的。
更好的解决方案是修复它 SQL 服务器端。