我正在运行一个多线程操作,使用SqlConnection
和Parallel.ForEach()
从SQL Server数据库中获取数据,并且正在发生以下情况:
SqlConnection
包裹在using
语句中,以便正确处理连接。SqlException
包裹在AggregateException
中(“在建立与SQL Server的连接时出现网络相关或特定于实例的错误..”) using(...)
)我对如何指示.NET关闭这些连接感到茫然。我认为当SqlConnection
被处置时,这种情况会自动发生。
答案 0 :(得分:1)
问题似乎与连接的打开方式有关。我正在使用这个构造函数
public SqlConnection(string connectionString, SqlCredential credential)
似乎ADO创建了一个新的连接池,即使connectionString
相同且credential
封装了相同的凭据。我的猜测是,ADO无法将凭证与先前的调用联系起来(如果我通过使用引用相等来使用相同的凭证对象,它可能会起作用吗?在我的情况下,我会在每次调用时创建一个新的SqlCredential)。
由于每次都会创建一个新池,因此TCP连接的数量为气球。我认为这在连接池关闭时也是有意义的。可能一些套接字或TCP设置在这里开始(保持活着?),操作系统保持连接打开以尊重这些设置。
答案 1 :(得分:0)
即使连接对象被释放回池,在执行垃圾收集之前,非托管资源可能不会被释放。通过减慢命令(删除该索引),您可以给GC足够的时间将资源释放回操作系统。
如果您没有使用Async命令执行,则可以尝试在线程级别缓存连接对象。然后并行操作将继续重复使用相同的开放连接,而不是抓住新的套接字等。
我还没有针对防止某些资源过度使用的异步操作进行任何测试。我相信他们会使用IO完成端口来阻止阻塞。并且,您绝对不希望使用相同的连接对象在该状态下使用两个命令对象。