2012-07-02 46 views
2

這個問題在StackOverflow中已經被問到過了,但根據我的經驗,答案其實是錯誤的。至少對於.NET Framework 4.0和SQL Server 2005來說,它們是錯誤的。無狀態WCF服務和數據庫連接池

我需要幫助來徹底整理一下。

問題是 - 無狀態WCF服務可以以某種方式使用數據庫連接池嗎?

Can a Stateless WCF service ...

早期的答案基本上是說,有沒有問題,任何其他ADO.NET的情況沒有什麼區別。但是,我無法獲得無狀態WCF服務來使用連接池EVER,而我可以看到它始終在WCF服務之外工作。無論我嘗試使用什麼連接字符串或參數,它都不會這樣做。

數據庫連接池是爲了在默認情況下啓用,因此一個簡單的連接字符串應該讓我有,例如在SQL Server Express的:

SqlConnection sqlCn = new SqlConnection("Data Source=SERVER\SQLEXPRESS; Initial Catalog = xDB; Integrated Security = SSPI;") 

通過這種連接,在Windows窗體應用程序,如果我連續做了3輪sqlCn.Open() - 查詢數據庫 - sqlCn.Close(),我在第一個sqlCn.Open()上得到了很長的延遲(例如2秒),查詢時沒有任何延遲,之後打開/關閉。正是我期望的數據庫連接池。

但是,如果我向包含相同sqlCn.Open()的WCF服務進行3次調用 - 查詢數據庫 - sqlCn.Close()代碼,我將獲得每次單次調用的2秒初始慢啓動。

我的猜測是連接池完全由我的代碼創建的ADO.NET對象控制,並且因爲我正在實例化我的WCF服務中使用的任何ADO.NET類(例如SqlConnection等),所以它們會得到當我的服務電話結束時,以及連接池一起銷燬。

這可能不是真的,但如果不是這樣,我所做的事情有什麼問題嗎?

任何人有任何經驗嗎?

(請不要測試,然後再發布任何假設或理論)

+0

你確定你的連接使用try {...} {最後的Connection.close()被關閉,甚至在例外的情況下,例如; }或使用聲明? –

+0

是的,他們正在明確關閉。 – nepdev

回答

0

1)這裏的文檔:

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

當連接第一次打開時,是基於 創建一個連接池在一個完全匹配的算法中,該算法將池與連接中的連接字符串 相關聯。每個連接池都與不同的連接字符串關聯,爲 。當打開一個新連接 時,如果連接字符串與現有的 池不完全匹配,則會創建一個新池。根據每個進程,每個連接字符串使用 應用程序域,每個Windows標識使用集成安全性 時,會爲每個進程彙集連接。連接字符串也必須是完全匹配的 ;以相同的 連接以不同順序提供的關鍵字將單獨彙集。

2)通過相同的鏈接,「默認情況下,在ADO.NET中啓用連接池。」

3)這是一個完全獨立的問題WCF調用是否是無狀態的或沒有。

4)最後:

我們強烈建議您始終使用它關閉連接,當你 完成後,使連接將被返回到 池。您可以使用連接對象的Close或Dispose方法,或通過在C#中使用 語句或Visual Basic中的Using語句打開所有連接來完成此操作。沒有明確關閉的連接 可能不會被添加或返回到 池。

+0

我知道這個文檔。但是在我的系統中的物理世界中,它並不遵守文檔所要求的。 「Pooling = true」的顯式設置對於解決它的任何原因都是必需的。 – nepdev

0

我設法解決它自己。

我必須明確指出「池=真」(和非零「閩池大小」添加)我的連接字符串。然後它一直工作。如果沒有確定,它有時會按預期工作,但大多數情況下不會。

我用不同的用戶帳戶(含用戶名/密碼與「集成安全性= SSPI」 SQL Server身份驗證)測試,它也。只要您設置「Pooling = true」,這兩種方法都可以用於WCF服務。

沒有任何數據,如果這是隻爲我安裝/ SQL Server版本/ ADO.NET中的一個問題,但它的確需要相當一段時間來解決。