.Net多线程:SQL ConnectionPool

时间:2008-09-25 01:17:13

标签: .net multithreading connection-pooling

在VB.Net Windows服务中,我目前正在使用以下工作单元:

ThreadPool.QueueUserWorkItem(operation, nextQueueID)  

在每个工作单元(或者我将用于易于理解的线程)中,它将进行一些MSSQL操作:

    Using sqlcmd As New SqlCommand("", New SqlConnection(ConnString))
        With sqlcmd
            .CommandType = CommandType.Text
            .CommandText = "UPDATE [some table]"

            .Parameters.Add("@ID", SqlDbType.Int).Value = msgID

            .Connection.Open()
            .ExecuteNonQuery()
            .Connection.Close()   'Found connections not closed quick enough'
        End With
    End Using

在服务器上运行netstat -a -o时,我看到大约有50个连接到IDLEESTABLISHED的SQL服务器,这对我来说似乎太过分了,特别是因为我们有更大的Web通过5-10个连接获得的应用程序。

连接字符串对应用程序是全局的(不会更改),并且还定义了Pooling=true

现在每个线程都有自己的ConnectionPool,或整个.EXE进程中有一个ConnectionPool吗?

4 个答案:

答案 0 :(得分:4)

来自MS Docs -

“每个进程,每个应用程序域,每个连接字符串以及使用集成安全性时,每个Windows标识都会连接到”

http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

您是否遇到错误,例如 -

异常详细信息:System.InvalidOperationException:超时已过期。超时 从池中获取连接之前经过的时间段。这可能已经发生过 因为所有池化连接都在使用中,并且达到了最大池大小。

此外,还有多少工作项在服务中排队?

答案 1 :(得分:2)

您的代码的一个大问题是,如果ExecuteNonQuery抛出异常,您就不会关闭连接。处理SqlCommand是不够的,您还需要在抛出异常时处置SqlConnection,如:

Using SqlConnection connection = New SqlConnection(ConnString)
    Using sqlcmd As New SqlCommand("", connection)        
        With sqlcmd            
          ... etc
        End With    
    End Using
End Using

答案 2 :(得分:1)

虽然我通常喜欢using语句,但我发现有时在.NET库中,句柄的实际CLOSE直到垃圾收集才会完成。因此,作为旧学校和宗教有关这些事情,我在使用声明的最后添加了明确的结论。这是pseduo代码,因为我通常使用C#而不是VB.NET编写代码,但它应该给你这个想法。

Using SqlConnection connection = New SqlConnection(ConnString)

   TRY
      Using sqlcmd As New SqlCommand("", connection)
                  With sqlcmd
                        ... etc
          End With
      End Using
   FINALLY
      connection.Close()

End Using

答案 3 :(得分:0)

如果打开的连接数量冒犯了您,请在connection string

中进行控制

注意:MinPoolSize和MaxPoolSize。