我目前正在創建一個WCF Web服務。SqlConnection/SqlCommand線程安全嗎?
作爲其工作的一部分,它不幸需要做一些相當密集的計算,但是這些計算可能會在調用web服務之間共享。實際上 - 我們只需要進行一次計算,所有後來的調用都可以獲得好處。
但是,由於WCF沒有共享應用程序狀態,因此將WCF設置爲單實例模式似乎是合理的。 (每個客戶端需要某些計算在所有的情形產生,迫使我們重新計算他們每serssion這可能是好的,或者每個調用,它是站不住腳的)
不過,我不是很熟悉的固定碼爲多個線程。 我一直在讀它,並且因爲我們的WCF代碼都沒有寫入共享狀態(除了易於保護的計算位),我幾乎相信我不需要改變任何東西。
雖然存在一個問題 - 我們使用SqlConnection和SqlCommand與我們的後端進行通信,我不確定是否可以指望這些線程安全?
編輯:我應該澄清一下,命令/連接總是本地的方法。我們在靜脈說話的模式:
using sqlConn = new SqlConnection(...) {
try {
sqlConn.Open()
} catch() {
throw new FaultException();
}
var cmd = new SqlCommand("Some SQL", sqlConn);
var reader = cmd.ExecuteReader();
//Read the stuff
reader.Close();
//Return something
}
編輯完
我擡頭一看MSDN上的SqlCommand類: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx 它說:「任何公共靜態成員(在Visual Basic中的Shared)這種類型是線程安全的,任何實例成員都不能保證線程安全。「
我是否認爲這是正確解釋這意味着MS確實而不是保證SqlCommand在多線程場景中工作?
如果沒有,是否有線程安全的替代方案?
是的,我可以只鎖定在我的web服務所有的數據庫訪問方法,但一)它的醜陋和b)如果它沒有必要我寧願我沒得:)
乾杯提前!
如果您不跨線程共享同一實例,並且類的靜態部分是線程安全的,那麼您沒有問題 –
不要在線程之間共享這些實例,打開它們,運行查詢並處理儘快地。連接池將處理連接優化。 – TheCodeKing