2011-02-13 71 views
0

我正在創建一個Web服務,它有許多方法,所有這些方法都使用SqlConnection。我將聲明一個類級別的連接並在Web服務構造函數中初始化它似乎是合乎邏輯的。asp.net webservice OnUnload?

問題是我無法找到一個確定的方式來釋放連接時,Web服務調用完成,所以我有一個連接泄漏。我嘗試覆蓋Dipose()方法,但它沒有在合理的時間內調用(實際上根本不在我的測試中)。爲了更好的衡量,我還嘗試在Disposed()事件中附加一個處理程序,但是卻像預期的一樣。

有沒有類似於Web服務類的Page.OnUnload?似乎很難相信我必須在每種單獨的方法中建立一個單獨的連接。

有什麼建議嗎?

回答

3

我聲明一個類級連接似乎是合乎邏輯的,並在Web服務構造函數中初始化它。

不,這似乎不符合邏輯。 ADO.NET使用connection pooling,因此您不需要執行此操作。此連接池是每個應用程序域的每個連接字符串。

所以,你可以簡單地畫從水池中的每個Web方法一個新的連接,並在最後返回到庫(using報表會照顧這一點):

[WebMethod] 
public void Foo() 
{ 
    // Here you are NOT creating a new connection to the database 
    // you are just drawing one from the connection pool 
    using (var conn = new SqlConnection(SomeConnectionString)) 
    using (var cmd = conn.CreateCommand()) 
    { 
     // Here you are NOT opening a new connection to the database 
     conn.Open(); 
     cmd.CommandText = "SELECT id FROM foo"; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       // do something with the results 
      } 
     } 
    } // Here you are NOT closing the connection, you are just returning it to the pool 
} 

所以這裏有一個建議:不要嘗試通過使用某些類字段,靜態字段來手動管理連接......將此管理留給ADO.NET,因爲它更好。

備註:我所展示的代碼通常駐留在一個數據訪問層中,該數據訪問層被web方法調用。

+0

感謝達林,但這實際上是我試圖避免,即必須裝飾每個方法與使用{}塊。我瞭解連接池如何工作,我在談論的是減少webservice類中的代碼開銷。由於需要在每個方法中使用連接對象,所以我希望將該聲明放在類級別的一個位置,並使用構造函數/析構函數(這就是我的邏輯意思)。你所描述的是我目前正在使用的,我希望能找到一個更好的方式。 – aaaaaaaaaaaaaaa1111111 2011-02-13 20:39:20