2010-10-29 71 views
0

我們應該在類中重用一個Static SqlConnection,還是最好創建它的一個實例?C#靜態SQLConnection

FactoryDB factory = 
    FactoryDB.GetInstance("sp_select_regional", TipoExecucao.StoredProcedure, 
     "portal_sadiaConnectionString"); 

factory.AutoReset = true; 

using (FactoryDB.Conn) 
{ 
    factory.ParametersCount = 1; 
    factory.Parameters[0] = 
     FactoryDB.CreateParameter(((IMarcas)Comentario).IDMarca, 
      'I', "@int_id_marca"); 

    factory.AddParameters(); 

    foreach (DataRow drFilial in factory.GetData().Rows) 
    { 
     Regionias filial = new Regionias() 
     { 
      IDRegional = Convert.ToInt32(drFilial["int_id_regional"]), 
      TxtRegional = drFilial["txt_regional"].ToString() 
     }; 

     lstRegional.Add(filial); 
    } 

    return lstRegional; 
} 

在這個例子中「使用」使用來自FactoryDB類的靜態的SqlConnection,它使用Singleton模式來獲得它的唯一實例。

我想知道是否正確使用這樣的連接,導致如果想要在DB中執行另一個查詢,我需要將「FactoryDB.Conn」屬性設置爲NULL。

+0

你真的試着運行這段代碼嗎?它會失敗,出現ObjectDisposed異常,第二次嘗試使用'SqlConnection'。 – Steven 2010-10-29 13:19:10

+0

我的alerady使用這個,它工作正常!屬性「AutoReset」,設置連接爲null後執行。 – ozsenegal 2010-10-29 13:20:45

+1

在這種情況下,它不是一個單身人士:-) – Steven 2010-10-29 13:24:00

回答

11

每次需要時創建一個新的SqlConnection實例,並儘快處理。底層連接池將能夠管理物理連接。

如果你使用一個靜態連接,事情就變得非常複雜如果你需要任何多線程...

編輯:如果你設置的值設置爲null,因此會得到重建無論如何,有一個靜態變量有什麼好處?只需使用局部變量:

using (SqlConnection connection = CreateConnection()) 
{ 
    ... 
} 

更簡單,沒有線程彼此踐踏的風險。

+0

在本例中,查看每次執行查詢時,SqlConnection設置爲null,並且如果需要重用,則會自動創建一個新的SqlConnection。要點是靜態的,但總是有一個新的連接,在一個問題。 – ozsenegal 2010-10-29 13:24:38

+1

@ user257234 - 如果你每次都要「處置」它,使它成爲「靜態」並不會爲你購買任何東西(根據Jon的說明,物理連接在封面下處理),並且令人困惑。 – 2010-10-29 13:28:00

+1

@ user257234:那爲什麼要打擾靜態變量呢? – 2010-10-29 13:30:30

2

此構造存在問題,因爲在退出using聲明的範圍時,財產將獲得Dispose -d。管理內存所有權未完全封裝的屬性可能會造成混淆和易出錯。

通常在您使用本地作爲using是合適的:

using (X x = new X()) 

這一邊 - 您可以使用一個static,如果你不希望多個線程在同一時間打這個代碼,或防止通過鎖定它。否則,我會在using聲明中使用通過new創建的本地實例。

0

當引用SQL連接時,使用單例與實例化對象的值對我而言並不清楚。

如前所述,連接池處理到數據庫的物理連接。每次執行查詢時強制關閉SQL連接實際上都會對性能產生影響。大多數數據庫操作中成本最高的部分是建立通信。

我不得不同意其他答案,最好的方法是在查詢時創建一個新的SqlConnection,並允許SQL Server處理可用連接的使用和重用。