2010-03-04 71 views
4

問候,我想問一下,如果創建Singleton只有一個活動連接到數據庫是個好主意。我想這樣做的是: 1)我有一個WCF服務 2)WCF服務從數據庫 3)我想創建這樣一個單獨獲取的數據只具有一個連接到數據庫:SqlConnection Singleton

private static PersistanceSingleton _Instance; 
    public static PersistanceSingleton Instance 
    { 
     get 
     { 
      if (_Instance == null) 
      { 
       _Instance = new PersistanceSingleton(); 
      } 
      return _Instance; 
     } 
    } 

我知道這不是一個理想的單身人士,但我只是爲了這個帖子而寫了它。 我想在這裏有一些持久性存儲庫,我將在構造函數中實例化它們。 在我的服務類我會內部構造下面的代碼

_DBPersistanceSingleton = PersistanceSingleton.Instance; 

然後,當一些請求時(如GetUsersRequest)我想這樣做:

_DBPersistanceSingleton.GetUsers() 

每次調用之前db是執行我也會檢查SqlConnection是否打開。 請讓我知道這是否是一種好的做法。我之所以想到這個解決方案的原因是因爲大量的用戶將通過客戶端應用程序連接到該服務。

+0

最理想的單身人士是你永遠不會創造的。 – Hardryv 2010-03-04 20:01:38

+0

對於您在一個靜態應用程序類中維護單個SQLConnection可能是最理想的,並且需要使用try..catch..finally分組來確保您在使用後始終關閉它。這在我們的企業應用程序中效果很好。 – Hardryv 2010-03-04 20:04:42

回答

12

這樣重用SqlConnection不是一個好習慣。在需要時打開它,並在完成後立即關閉它。連接池將在您重新使用連接的情況下爲您工作。

+0

沒問題,但隨後活動監視器中的活動連接列表急劇增加,有時池並不處理所有這些連接。什麼時候連接(與狀態休眠)被處置? – 2010-03-04 19:19:21

+2

@niao:我不確定釋放連接的超時時間。如果您擔心連接數量,可以在連接字符串中設置最大池大小。您也可以通過調用ClearPool方法手動清除池。請參閱:http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.80).aspx – 2010-03-04 19:30:49

+0

親愛的Mehrdad Afshari我如何設置釋放連接超時? – 2010-03-04 19:43:11

3

不,我強烈建議你不要。如果多個請求同時進入,會發生什麼?他們不能全部使用相同的連接,充其量只會引入一個大瓶頸。

連接池會自動爲您處理,並且避免了您的麻煩,因此您無需擔心。根據需要打開和關閉連接。

+0

爲了迂迴,使用MARS,可以重複使用單個連接。 – 2010-03-04 19:16:27

+0

@Mehrdad - 好點,我可能應該這樣說。 – AdaTheDev 2010-03-04 20:06:45

1

把SQL連接一旁......

這Singleton模式不是線程安全的,是一個壞主意,在多線程應用程序使用(如您的WCF服務是有此可能)。

使用此代碼,如果有多個同時請求到達,可能會創建多個實例。