2010-03-03 56 views
2

什麼是在.NET中編寫.NET3.5線程安全數據源類的好方法。該類將連接到SQL Server,每個方法都會執行一個存儲過程。C#數據源類和線程安全

當代碼工作單線程。我有一個Singleton DataSource類和一個私有的SqlConnection成員。每個方法打開和關閉該連接。當使用多個線程運行時,在某些情況下連接已經被另一個線程打開時會造成麻煩。重寫這門課程最好的方法是什麼?

注意:通過DataSource不要表示任何內置的.NET類,但是提供數據到控制器的Model類。

回答

2

這個問題似乎是來自於Singleton的設計。這仍然可以工作,只要確保你做而不是作爲一個字段存儲連接。只能在每種方法中使用局部變量來保存連接。這應該是線程安全的設計。

,並使其異常安全,以及:

using (var conn = new SqlConnection(...)) 
{ 
    // call SP 
} 
0

你必須詳細說明你的DataSource類應該做什麼。如果每個Create/Read/Update/Delete方法都不改變任何狀態,則不需要實現任何線程安全代碼。

更新:在你的情況下,我建議在你的DataSource類的每個方法中重新創建一個新的SqlConnection實例,因爲ADO.NET已經爲你處理了池。

+0

我已經更新的問題。 – 2010-03-03 11:55:55

+0

仍然使用Singleton? – 2010-03-03 12:43:31

+0

是的,如果你喜歡,你肯定可以使用Singleton,特別是當你的應用沒有連接到多個數據庫時。 (請記住,Singleton模式現在不推薦使用,建議使用IoC代替)。 – herzmeister 2010-03-03 13:17:05

2

SQL Server已經通過非常複雜的機制來協調線程。您不需要執行任何特定的操作來實現線程安全,只需執行一個存儲過程。

3

爲什麼不直接使用內置的ado.net池:在操作和創建之前創建並打開連接,並儘快處理 - 針對每種方法。