我有一些示例Web服务,如下所示,
<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方法
我的一些朋友说webservice是一种无状态方法,我们是否有关不关。这是真的吗?我也知道cnn对象的生命时间在
只有该方法和visualstudio会在该方法结束时处理它
我真的很想知道对象的生存期,它们是如何在内存上分配的,以及
它们在使用后何时被处理。
谨致问候,
Chong
是否关闭连接很重要。SQL Server对延迟的未关闭连接具有很强的弹性,但如果您使用Access,则会很快耗尽可用连接,并在尝试连接时收到错误消息。
您有一个连接对象和一个命令对象,这两个对象都是可丢弃的,所以您应该处理它们。仅仅让它们超出范围是不够的,.NET内存管理不能以这种方式工作。IDisposable接口适用于具有需要清除的非托管资源的对象。
如果你没能处理掉,大多数一次性物品都有一个收尾器作为备用,所以它们最终会被清理掉,但你想避免这种情况。您希望尽快处理对象,否则它们将保留在内存中,直到垃圾收集器来清理它们。
使用一次性对象的代码周围的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
您不需要显式调用close,因为调用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块确保无论您离开代码块,都会处理连接。一旦垃圾收集开始,整个东西就会被永久删除
您可能需要考虑一种新的错误处理策略,因为您不向客户端(或者在适当的情况下,用户)提供任何信息。客户端可以决定如何处理该错误。