網頁

2012年7月3日 星期二

[轉載] C# 淺析SqlConnection的dispose和close方法差異

原文

引用微軟ADO.Team的經理的話說,sqlconnection的close和dispose實際是做的同一件事,
唯一的區別是Dispose方法清空了connectionString,即設置為了null.

SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg");
        con.Open();
        con.Close();
        con.Open();
        con.Dispose();
        con.Open();

上例運行發現,close掉的connection可以重新open
dispose的不行,因為connectionstring清空了,
會拋出InvalidOperationException提示The ConnectionString property has not been initialized,
但請注意此時sqlconnection對象還在。

如果dispose後給connectionString重新賦值,則不會報錯。 
由此得出的結論是不管是dispose還是close都不會銷毀對象,即不會釋放內存,
它們會把sqlconnection對象丟到連接池中,那此對象什麼時候銷毀呢?
我覺得應該是connection timeout設置的時間內,
如果程序中沒有向連接池發出請求說要connection對象,sqlconnection對象便會銷毀,
這也是連接池存在的意義。

剛開始以為dispose會釋放資源清空內存,
如果這樣的話,連接池不是每次都是要創建新對象,那何來重用connection呢?
在網上看到很多人說close比dispose好,
我想真正的原因是dispose後的sqlconnection對象要重新初始化連接字符串而已,
並不是像某些人說的dispose會釋放對象。

所以在try..catch和using的選擇上大膽的使用using吧,
真正的效率差異我想可能只有百萬分之一秒吧
(連接池重用該連接對象初始化連接字符串的時間),
而且enterprise library中封裝的data access層全是用的using,
從代碼的美觀和效率上綜合考慮,using好 

補充:
using不會捕捉其代碼快中的異常,
只會最後執行dispose方法,相當於finally{dispose},
本文主要是想說明dispose和close的差異,因為using是絕對dispose的,
可是如果人為的寫try..finally有的人會選擇close有的人會選擇dispose,
實際上在這2者的選擇上是有差異的。

沒有留言:

張貼留言