程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> SqlConnection的dispose和close方法差異和using的使用選擇

SqlConnection的dispose和close方法差異和using的使用選擇

編輯:關於.NET

Close() and Dispose() are basically the same thing on an ADO.NET connection

object for providers shipped by Microsoft, and typically for 3rd party

providers as well (haven't seen one that does it differently, but you never

know :). The only difference is that Dispose also clears the connection

string. Calling only 1 of them is enough - whichever you prefer or applies

more to your scenario (e.g. C# "using" statement calls Dispose).

--

Pablo Castro

Program Manager - ADO.NET Team

Microsoft Corp.

引用微軟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者的選擇上是有差異的,dispose方法會執行 close方法

protected override void Dispose(bool disposing)

{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);

如有錯誤,希望高手不吝指正

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved