2011-06-08 226 views
0

我有一些樣品webservice的類似下面,VisualStudio中的內存分配!

<WebMethod()> _ 
    Public Function ExecuteCMD() As Boolean 

     Dim cnn As New Data.SqlClient.SqlConnection   

     Try 
     cnn.ConnectionString = "ConnectionString Here" 
     cnn.Open() 

     Dim cmd As New Data.SqlClient.SqlCommand("CommandText Here", cn) 
     cmd.ExecuteNonQuery() 

     Return True 
     Catch ex As Exception 
      Return False 
     End Try 
    End Function 

通常情況下,我們總是關閉使用它, 後的連接,但從來沒有出現調用close方法。
我的一些朋友說, Web服務是無狀態的方法,它並不重要
我們是否有 將其關閉或not.Is是真的嗎?我也知道,CNN對象的生命時間是
只是方法和VisualStudio的意志處理該方法的結束。
我真的很想知道對象的使用壽命,它們在內存中的分配情況,以及在使用後如何處理它們的情況下

最好的問候,

回答

1

如果您關閉連接或沒有關係,這很重要。 SQL Server對持久的未關閉連接具有很強的適應性,但是如果您使用Access,則在嘗試連接時會很快耗盡可用連接並收到錯誤消息。

你有一個連接對象和一個命令對象,它們都是一次性的,所以你應該處置它們。讓它們超出範圍是不夠的,.NET內存管理不能這樣工作。 IDisposable接口適用於需要清理非託管資源的對象。

如果你不能處置它們,大多數一次性物品會有一個終結者作爲回退,所以它們最終會被清理乾淨,但是你想避免這種情況。你想盡快處理這些對象,否則它們將一直保留在內存中,直到垃圾收集器來清理它們。

A Using圍繞代碼使用一次性使用物件是一種很好的方法來確保妥善處置它。它使用Try...Finally塊來確保即使發生錯誤也始終處理對象。

<WebMethod()> _ 
Public Function ExecuteCMD() As Boolean 

    Using connection As New Data.SqlClient.SqlConnection   

    Try 
     connection.ConnectionString = "ConnectionString Here" 
     connection.Open() 

     Using command As New Data.SqlClient.SqlCommand("CommandText Here", connection) 
     command.ExecuteNonQuery() 
     End Using 

     Return True 
    Catch ex As Exception 
     Return False 
    End Try 

    End Using 

End Function 
+0

更好的描述IDisposable比我的。 – 2011-06-08 05:37:14

1

你並不需要顯式調用接近調用dispose會爲你關閉它。

如果你重構你的代碼稍微那麼你可以做到這一點

Public Function ExecuteCMD() As Boolean 

    Using cnn As New Data.SqlClient.SqlConnection("ConnectionString Here") 

     Try 
      cnn.Open() 

      Dim cmd As New Data.SqlClient.SqlCommand("CommandText Here", cnn) 
      cmd.ExecuteNonQuery() 

      Return True 
     Catch ex As Exception 
      Return False 
     End Try 

    End Using 

End Function 

using塊確保連接設置的,但是你離開代碼塊。整個事情將在permanantly被刪除一次垃圾收集踢。

你可能要考慮一下,你是給沒有信息返回給客戶端的一個新的錯誤處理策略(或在適當情況下,用戶)可以決定該怎麼處理這個錯誤。