1

在 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

在服务器上运行 anetstat -a -o时,我看到大约有 50 个与 SQL 服务器的连接位于IDLEor上ESTABLISHED,这对我来说似乎太过分了,特别是因为我们有更大的 Web 应用程序,可以通过 5-10 个连接来解决问题。

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

ConnectionPool现在这些线程中的每一个都有自己的ConnectionPool.EXE 进程吗?

4

4 回答 4

4

来自 MS Docs -

“每个进程、每个应用程序域、每个连接字符串以及在使用集成安全性时、每个 Windows 身份时,都将连接池化”

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

您是否遇到错误,例如 -

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

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

于 2008-09-25T01:22:00.613 回答
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
于 2008-09-25T06:55:23.260 回答
1

虽然我通常喜欢 using 语句,但我发现有时在 .NET 库中,句柄的实际 CLOSE 直到垃圾回收才完成。因此,作为对此类事情的老派和宗教信仰,我在 using 语句的末尾添加了一个明确的结束语。这是伪代码,因为我通常用 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
于 2009-01-09T21:43:39.940 回答
0

如果打开的连接数冒犯了您,请控制连接字符串

注意:MinPoolSize 和 MaxPoolSize。

于 2008-09-25T02:43:36.360 回答