2009-01-06 231 views
1

我有一個最多由10個客戶端調用的web服務。該webservice由7個不同的asmx頁面構成,每頁有大約100-200個功能。在webservice中處理sql-connections的最佳方法是什麼?

所有這些函數都針對MSSQL2005或MS SQL2000數據庫。在一天中的某些時段,來自客戶端的流量很大,似乎我的sql服務器上的連接用完,導致所有客戶端停止。

在每一個函數中,我打開一個連接,執行這些操作,然後關閉連接,有時候事務處理有時不會。

在服務器上,我發現它創建了很多連接,我不知道爲什麼它們不會消失,但是即使在函數完成並結束後,它仍然保留在那裏。所以我可以確保我的10位客戶不時創建超過80個連接。有時候他們中的一些人會消失,有時他們在使用後還有幾個小時。那裏是否有某種集合?

問題1: 是否有另一種方法來處理我應該使用的連接,如每個Web服務或其他任何方式的全局連接?

問題2: 如果它可以處理每個函數的連接,那麼爲什麼它不關閉服務器上的連接,使得打開的連接列表一直越來越大,直到我失去連接 - 錯誤?

這個問題是關係到我的其他問題,但不一樣的:Strange SQL2005 problem. "SqlConnection does not support parallel transactions"

我現在已經縮小下來的「出連接」的錯誤。

+0

您是否使用Windows身份驗證,並通過客戶的身份,還是您的Web服務已經使用的每一個連接一個用戶名/密碼?我認爲前者會影響ASP.NET集中連接的能力。 – 2009-01-06 19:56:14

+0

WebService的有用於創建所有連接一個ConnectionString的。沒有Windows驗證。 – Stefan 2009-01-06 20:49:31

回答

4

我同意有關重構的評論,但這不是相關的問題。

你絕對應該在每個函數中使用一個連接,聽起來好像你沒有正確處理它們。假設數據庫操作包含在您要調用的函數中,您的代碼應該如下所示:

using (SqlConnection connection = <connection code>) 
{ 
    using (SqlCommand command = <command code>) 
    { 
    // Execute. 
    } 
} 

在服務器端,連接將保持打開狀態。默認情況下,SqlConnection類啓用連接池,因此您將在服務器端看到連接打開。

此行爲是正常現象,應該是預期的。

0

因此,這是700-1400功能在一個單一的Web服務?聽起來對我來說太大了。時間重構。

我不知道頁面和Web服務之間的連接是什麼。我通常認爲它們是XML消息傳遞端點,與消耗它們的客戶端完全分開。

+0

它的一個大系統與許多不同的客戶端,以便它有它必須有大小。所有功能都不是全部使用,而是任何「某個時間」。 – Stefan 2009-01-06 20:48:40

3

您實際上正在看到連接池正在運行。這在默認情況下發生在.Net 2+到SQL 2005(不確定其他版本)。

連接池意味着.Net會爲你保留一些連接,這樣當你下一次需要連接時,開銷就會減少。 CLR可以給你一個已經打開(和清理)的連接,比直接重新連接數據庫快幾百倍。當您調用connection.Close()時,您只需將連接回傳到池中進行回收。

池存在每個單獨的安全上下文連接 - 這意味着所有連接使用相同的SQL安全將共享一個游泳池,而如果你使用的是Windows身份驗證,連接將有自己的游泳池每個用戶發。

您所看到的問題,因爲你打100間的連接 - 在池的默認最高金額(默認最小爲0)。此時池將無法提供另一個連接到一個已經被回收,因此應用程序將掛起或超時。您需要更改連接字符串以包含更高的最大數量(並且還要考慮切斷連接)。

相關問題