淺析SqlConnection的dispose和close方法差異
引用微軟ADO.Team的經(jīng)理的話說,sqlconnection的close和dispose實(shí)際是做的同一件事,唯一的區(qū)別是Dispose方法清空了connectionString,即設(shè)置為了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();
上例運(yùn)行發(fā)現(xiàn),close掉的connection可以重新open,dispose的不行,因?yàn)閏onnectionstring清空了,會拋出InvalidOperationException提示The ConnectionString property has not been initialized,但請注意此時sqlconnection對象還在。
如果dispose后給connectionString重新賦值,則不會報(bào)錯。
由此得出的結(jié)論是不管是dispose還是close都不會銷毀對象,即不會釋放內(nèi)存,它們會把sqlconnection對象丟到連接池中,那此對象什么時候銷毀呢?我覺得應(yīng)該是connection timeout設(shè)置的時間內(nèi),如果程序中沒有向連接池發(fā)出請求說要connection對象,sqlconnection對象便會銷毀,這也是連接池存在的意義。
剛開始以為dispose會釋放資源清空內(nèi)存,如果這樣的話,連接池不是每次都是要創(chuàng)建新對象,那何來重用connection呢?在網(wǎng)上看到很多人說close比dispose好,我想真正的原因是dispose后的sqlconnection對象要重新初始化連接字符串而已,并不是象某些人說的dispose會釋放對象。
所以在try..catch和using的選擇上大膽的使用using吧,真正的效率差異我想可能只有百萬分之一秒吧(連接池重用該連接對象初始化連接字符串的時間),而且enterprise library中封裝的data access層全是用的using,從代碼的美觀和效率上綜合考慮,using好
補(bǔ)充:using不會捕捉其代碼快中的異常,只會***執(zhí)行dispose方法,相當(dāng)于finally{dispose},本文主要是想說明dispose和close的差異,因?yàn)閡sing是絕對dispose的,可是如果人為的寫try..finally有的人會選擇close有的人會選擇dispose,實(shí)際上在這2者的選擇上是有差異的。
【編輯推薦】