我使用SqlConnection
和Parallel.ForEach()
运行多线程操作,从SQL Server数据库获取数据和下面正在发生的TCP连接:ADO.net不打烊速度不够快
- 我的包裹
SqlConnection
using
声明,以便连接正确处置。 - 我的过程始终抛出
SqlException
包裹在一个AggregateException
一段时间成功运行后(“建立到SQL Server的连接时发生网络相关的或特定于实例的错误。”) - 我发现,这种情况大约2^14(16384)调用数据库(总计,跨所有线程)。
- 我启动了perfmon,我可以看到这也是在引发异常的时候(“Connections Established”计数器)打开的TCP连接数。
- 我确信在我的代码中没有连接泄漏 - 我查询数据库的地方很少,他们都正确地处理连接(事实上,没有其他模式用于查询数据库比香草
using(...)
) - 我关闭了连接池并发生相同的行为。
- 奇怪的是,如果我在SQL Server中删除了一个使我的查询速度很快的索引,那么操作会成功完成(虽然速度很慢) - 不会引发异常。我观察到,建立的连接数线性上升到大约13K,然后稳定了一段时间,然后有一段时间线性下降,这一切都在运行时进行。
- 我的结论是,在建立索引的情况下,.net处理数据的速度比它能够关闭连接并最终达到某种操作系统或.NET套接字最大阈值更快。如果没有索引,.NET仍然保持着太多的连接,但是它有足够的时间关闭它们,以便最大打开套接字阈值不被打中。
我不知道如何指示.NET关闭这些连接。我认为当SqlConnection
被丢弃时,这种情况会自动发生。
特别奇怪的是,当连接池使用默认设置(100个连接)处于活动状态时,该ADO可以打开更多的TCP连接 - 就好像池连接正在被抛弃一样?!?! – SFun28