2013-11-26 150 views
4

如果我有幾個類在同一頁上使用相同的連接字符串,我應該保持連接open();並關閉它,一旦我完成或繼續打開和關閉。保持連接字符串是否打開c#

下面的例子

protected void Page_Load(object sender, EventArgs e) 
{ 
    cs.Open(); 
    something ... 
    cs.Close();  
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 

    cs.Open(); 
    something ..... 
    cs.Close(); 
} 

或本

protected void Page_Load(object sender, EventArgs e) 
{ 
    cs.Open(); 
    something ... 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    something ..... 
    cs.Close(); 
    cs.Dispose(); 
} 

回答

11

對於.NET一般來說所有非託管資源,如數據庫連接,應儘可能晚地打開和儘早關閉所以你展示了第一個選項是做正確的方式。

.NET提供了一個連接池,可以確保您打開的連接數超過需要的數量,因此當您打開或關閉時不會立即發生這種情況。但是,池可以管理所有連接,以保持與數據庫的開放和關閉通信的健康比率。

除非,當然,您還有其他一些情況需要保持連接打開狀態,例如當您處於事務中時。

5

首先,我會建議具有可與連接和線程池可以實現這個要求的抽象。 ADO.NET,實體框架,NHibernate等......

第二,永遠......永遠......永遠......把你的數據訪問代碼放到你的頁面控制器中。

在一個更實際音符,

始終把你的親密語句轉換成一個finally塊,所以它總是會不管是什麼拋出的異常調用。

4

當連接不再使用時,請始終關閉連接,然後在需要時重新打開連接。例如:

Connection.Open(); 
Command.ExecuteNonQuery(); 
Connection.Close(); 

你運行一個查詢每一次,你應該重新打開連接

1

是的,你需要釋放你的資源一旦完成,只有讓他們開了儘可能短。當您打開一個連接時,首先使用該池,所以這不是很昂貴。只要確保您使用connection pooling

而且,看using construct ..

using(var cn = new SqlConnection(...)){ 
//perform db work 
} 

這將調用dispose當您完成。任何實現IDisposable接口的類都可以用在Using語句中。

1

儘可能晚地打開與數據庫的連接,並儘早關閉它。在此之後,您應該確保您的連接始終關閉。請注意,這意味着不僅僅是編寫代碼connection.Close()。如果在連接處理中引發異常,則絕不會觸發該語句,並且您的連接將保持打開狀態。

嘗試與非託管資源打交道時使用using聲明:

using (var connection = new SqlConnection(...)) 
{ 
    connection.Open(); 
    // do some processing 
} 

這將確保您的連接正常關閉和處置。