我写了一个偶尔必须经常轮询数据库的服务。通常我会使用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服务器以进行各种查询,我希望尽可能多地并行运行(有时这显然效果很好)。
我想到了几种可能的解决方案:
建议的程序是什么或者是否有最佳的处理方法?
答案 0 :(得分:1)
最终解决方案并不完全理想(在SQL Server端修复问题)所以我最终检查了作业排队系统中的并发连接数。
该服务现在不会为文档生成创建另一个线程,除非它可以保证连接池实际可用。 SQL服务器上的坏瓶颈仍然存在,但服务现在不再生成异常。
当然,缺点是,当SQL Server上执行一些阻塞查询时,队列会变长,这可能会导致文档生成一两分钟。因此,它不是一个理想的解决方案,而是一个可行的解决方案,因为延迟并不重要,因为文档不是直接需要的,而是存储用于存档目的。
更好的解决方案是修复SQL Server端。