2012-03-21 189 views
1

這是我一直想知道的事情....會嗎?當應用程序關閉時,數據庫連接會立即關閉嗎?

因爲每當我編寫代碼使用DB連接時,我總是不得不保證在處理之前關閉下一個塊。

但是當,如果我有一個開在其構造連接,直到它擊中保存按鈕不會關閉或取消按鈕ChildWindow。那麼如果整個應用程序關閉了,數據庫連接會立即關閉嗎?或者它必須等待超時並自動關閉?

編輯:

所以我想保持實時連接打開登錄我的應用程序的所有錯誤:

public App() 
{ 

    ErrorHelper errorHelper = new ErrorHelper(); // Will open DB connection 
    AppDomain currentDomain = AppDomain.CurrentDomain; 
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException); 

} 

/// <summary> 
/// For catch all exception and put them into log 
/// </summary> 
void currentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 

    errorHelper.WriteError(e.ExceptionObject as Exception);    

} 

因爲我不喜歡我怎麼打開連接,每次登錄一個錯誤,所以我想保持連接一直打開。這與我描述的OP相似。在這種情況下,它始終保持連接。但數據庫連接在退出後會立即關閉嗎?

+1

@Oded,我沒有看到關於現有應用程序的行爲的任何假設。 – mikerobi 2012-03-21 19:56:11

+0

@按要求提供,我推出了一些我正在研究的內容。但正如mikerobi所說,我想知道退出應用程序的行爲。沒有解決方法來確保連接關閉。 – 2012-03-21 20:05:42

回答

2

短期和簡單的答案:總是用在using語句間的連接:

using (var db = new Connection()) 
{ 
    ... 
} 

,然後你將不必擔心 - 它只是接近時,它超出範圍,是它的結束方法,例外或應用程序關閉。

+2

是的,但沒有回答這個問題。 – 2012-03-21 20:03:03

+0

但是你的問題並不清楚 - 你想完成什麼?知道如果連接將關閉?知道連接何時關閉?你告訴@Oded你的問題不是假設。請明確點。 – 2012-03-21 20:08:19

+0

@OferZelig我只想知道應用程序是否關閉,所有打開的數據庫連接會立即關閉?所以我不必擔心數據庫連接是否有機會長時間存在。 (假設應用程序由1000個用戶運行,如果連接在應用程序退出後不會立即關閉,而是等待一段時間超時並關閉,則有可能會保留許多未使用的連接。)對不起,也許有人會認爲我使問題複雜化了。但我只想清楚知道會發生什麼。 – 2012-03-21 20:23:58

2

因爲我不喜歡每次打開連接都記錄一個錯誤,所以我想保持連接一直打開。

這就是連接池是。你是否衡量了你的表現或者你是否確定了有力的證據表明這是一個問題?

打開和關閉與using塊的連接,讓連接池做的工作。

如果您的進程退出,您的連接將被關閉。

+0

'使用'塊基本上就是'try {...} finally {obj.Dispose()}'。我記得當我使用NexusDB的時候(是的,並不是着名的),每次寫入時與ADO的開放連接比開放連接慢一次並寫下所有內容。 – 2012-03-21 20:15:03

+1

@陳陳ADO.NET有連接池。 http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx – dotjoe 2012-03-21 20:30:02

+0

@dotjoe Ooooh,我明白了。讀完之後。我只寫了一個小程序,用ADO打開連接(使用MsSQL)來測試性能,並在需要時打開。它大約相同。奇怪......那麼當我使用NexusDB進行測試時,怎麼會慢得多...... +1 – 2012-03-21 20:55:30