【发布时间】:2014-04-28 17:40:20
【问题描述】:
在我使用远程数据库的 Winforms 应用程序中,我具有以下功能。 (我还有另外两个类似的函数:一个用于标量查询,失败时返回零,另一个用于更新和插入,失败时返回 false。)
目前,所有数据操作都是通过这三个函数进行的。
它工作正常,但总体而言,请告知我是否最好在启动我的应用程序时建立连接,然后在应用程序被终止时关闭它?还是在其他时间? (同样,它是一个 Windows 窗体应用程序,因此当用户需要长时间的午休时,它可能会停滞不前。)
到目前为止,我没有看到任何不良影响,因为一切似乎都是“眨眼之间”发生的......但是我获取数据的速度是否较慢,或者是否存在任何其他潜在危险,例如内存泄漏?请注意,无论函数如何终止,我都会关闭连接。
Public Function GetData(ByVal Query As String) As DataTable
Dim Con As New SqlConnection(GlobalConnectionString)
Dim da As New SqlDataAdapter
Dim dt As New DataTable
Try
Con.Open()
da = New SqlDataAdapter(Query, Con)
Con.Close()
da.Fill(dt)
Catch ex As Exception
Debug.Print(Query)
MsgBox("UNABLE TO RETRIEVE DATA" & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Unable to retrieve data.")
End Try
da.Dispose()
Con.Close()
Return dt
End Function
【问题讨论】:
-
你知道.NET中有一个连接池吗(实际上是在windows中,很多年了),连接会保持打开一段时间以被重用?
-
我不知道这一点,但您认为这个事实可能会如何影响我的代码?我相信在退出该功能时,SqlConnection 会自动在.net 中作为垃圾收集,不是吗?如果是这样,似乎在第二次(或第 100 次)调用该函数时,它正在创建一个真正的新连接,即使它仍然具有相同的名称,对吧?
-
SqlConnection 应该被垃圾收集,是的,但在内部连接将保持打开状态。所以下次你调用 open 时,它只是从池中获取一个未使用的连接。更多信息:SQL Server Connection Pooling (ADO.NET)。关于您的代码,您可能会发现
Using方法看起来更好:stackoverflow.com/questions/16903289/… -
最佳做法是尽快关闭每个数据连接。这意味着您应该不按照第二段中的建议在启动时建立连接并在关闭时关闭它。您可能会发现这个MSDN Best Practices article 很有用;关于使用连接的部分大约在页面下方的 2/3 处。我也同意@Neolisk 关于
Using的看法。 -
@PaulOTron2000 当方法退出时,SqlConnection 不会自动收集...至少不会马上。垃圾收集是不确定的,因此对象可能会徘徊一段时间。依靠垃圾收集来关闭您的连接可能会导致拒绝服务情况,如果您的应用程序的足够实例这样做的时间足够长,以至于您耗尽了数据库服务器支持的连接数,并有效地将自己锁定在数据库之外。这就是为什么连接应该总是作为
Finally块的一部分被关闭。
标签: sql sql-server vb.net winforms