2008-09-25 60 views
1

在VB.Net Windows服務我目前正在集中工作單位:淨多線程:SQL連接池

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 

運行時我看到約50個連接到SQL Server坐在IDLEESTABLISHED服務器上的netstat -a -o,這似乎是過分了我特別是因爲我們有更大的Web應用程序t通過5-10個連接。

連接字符串對應用程序是全局的(不會更改),也有Pooling=true定義。

現在每個這些線程都有自己的ConnectionPool,或者是否有一個ConnectionPool用於整個.EXE進程?

+0

服務中有多少個工作項正在排隊? – Kev 2008-09-25 01:33:16

回答

4

從MS文檔 -

「連接每個進程的彙集,每個應用程序域,每個連接字符串和集成時的安全使用,每Windows標識」

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

您是否遇到錯誤如 -

異常詳細信息:System.InvalidOperationException:超時過期。在從池中獲取連接之前超時 已過期。這可能發生了 ,因爲所有連接的池都在使用中,並且達到最大池大小。

還有多少工作項正在服務中排隊?

+0

不,我沒有用完連接(不是默認的最大值是25還是100?) – 2008-09-25 01:30:33

0

如果打開的連接數冒犯您,採取控制在connection string

聲明:和了MinPoolSize MaxPoolSize。

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 
1

雖然我一般喜歡using語句,我發現,有時候在.NET庫的實際關閉直到垃圾收集才完成處理。因此,作爲舊學校和宗教信仰這些事情,我在我的使用聲明結尾處添加了明確的結尾。這是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