簡體   English   中英

無狀態WCF服務和數據庫連接池

[英]Stateless WCF service and database connection pooling

之前在StackOverflow中已經問過這個問題,但以我的經驗,答案實際上是錯誤的。 至少對於.NET Framework 4.0和SQL Server 2005,它們是錯誤的。

我需要幫助來一勞永逸地解決這個問題。

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

請參閱可以無狀態WCF服務...

較早的答案基本上表明,與任何其他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() ,則我在第一個獲取的延遲很長(例如2秒) sqlCn.Open() ,查詢完全沒有延遲,然后打開/關閉。 正是我期望的數據庫連接池。

但是,如果我對包含相同sqlCn.Open()的WCF服務進行了3次調用-查詢數據庫sqlCn.Close()代碼,則sqlCn.Close()單次調用都會有2秒的初始緩慢啟動。

我的猜測是,連接池完全由我的代碼創建的ADO.NET對象控制,並且由於我在WCF服務中實例化了我使用的任何ADO.NET類(例如SqlConnection等),因此在我的服務中它們會被銷毀通話結束,連接池也隨之結束。

這可能不是正確的,但是如果不是,我所做的事情有什么錯誤嗎?

有人對此有經驗嗎?

(請在發布前測試任何假設或理論)

1)這是文檔:

http://msdn.microsoft.com/zh-CN/library/8xx3tyca.aspx

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

2)對於同一鏈接,“默認情況下,ADO.NET中啟用了連接池”。

3)這完全獨立於所討論的WCF調用是否為無狀態。

4)最后:

強烈建議您在使用完連接后始終關閉該連接,以便將連接返回到池中。 您可以使用Connection對象的Close或Dispose方法,或通過在C#中的using語句或Visual Basic中的using語句中打開所有連接來執行此操作。 未顯式關閉的連接可能不會添加或返回到池中。

我設法自己解決了。

我必須在連接字符串中明確聲明“ Pooling = true”(並添加非零的“ Min Pool Size”)。 然后它一直在工作。 如果未設置,則有時實際上會按預期運行,但大多數情況下不會。

我還使用不同的用戶帳戶進行了測試(使用用戶名/密碼的SQL Server身份驗證與“集成安全性= SSPI”)。 只要您設置“ Pooling = true”,這兩種方法都適用於WCF服務。

如果這僅是我的安裝/ SQL Server版本/ADO.NET版本的問題,則沒有數據,但是確實需要花很長時間才能解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM