DataAdapter本身并未关闭连接

时间:2014-10-10 05:05:46

标签: mysql database-connection dataadapter

我们知道DataAdapter打开并关闭一个Connection(如果它尚未打开)。但是我的代码打开但没有关闭..我正在使用MySql.Data.MySqlClient.MySqlDataAdapter,不知道我做错了什么。下面是我的代码

Public Function GetDT(ByVal SqlQuery As String, ByVal ConString As String) As DataTable
    Dim da As New MySql.Data.MySqlClient.MySqlDataAdapter(SqlQuery, ConString)
    Dim ds As New DataSet
    da.Fill(ds)
    GetDT = ds.Tables(0)
    da.Dispose()
    ds.Dispose()
    da = Nothing
    ds = Nothing
End Function

我正在使用此连接字符串:"server=localhost;port=3306;user=someuser;pwd=somepassword;database=mydatabasename;Allow Zero Datetime=True;"

在调试代码时,我发现DataAdapter.fill一旦执行它就启动了一个连接线程,但是当线程保持SLEEP状态时,没有连接接近的地方。请查看下图。

enter image description here

任何人都可以帮我这个吗?

由于

2 个答案:

答案 0 :(得分:1)

它的正常行为是因为ADO.NET默认使用SQL Server连接池。来自MSDN:

http://msdn.microsoft.com/en-US/library/8xx3tyca(v=vs.110).aspx

  

连接到数据库服务器通常包含几个   耗时的步骤。物理通道,例如套接字或命名   必须建立管道,与服务器的初始握手必须   发生时,必须解析连接字符串信息   连接必须由服务器进行身份验证,必须运行检查   参与当前交易,等等。

     

实际上,大多数应用程序只使用一种或几种不同的应用程序   连接配置。这意味着在申请期间   执行时,将重复打开许多相同的连接   关闭。为了最大限度地降低打开连接的成本,ADO.NET使用了   称为连接池的优化技术。

     

连接池减少了新连接的次数   必须打开。平民保持对物质的所有权   连接。它通过保持一组活动来管理连接   每个给定连接配置的连接。每当一个用户   调用在连接上打开,pooler查找可用的   池中的连接。如果池连接可用,则为   将其返回给调用者而不是打开新连接。 当   应用程序调用关闭连接,pooler将其返回   合并的一组活动连接而不是关闭它。一旦   连接返回到池中,它已准备好在池上重用   下一次公开电话。

     

...

     

连接池在拥有后从池中删除连接   闲置了大约4-8分钟,......

DataAdapter中“using”或“dispose”的效果是相同的。 “using”确保即使发生异常也会执行dispose。与使用try / finally语句相同,并将“dispose”放在finally部分。

答案 1 :(得分:0)

当您使用Using指令时,连接仅自行关闭,Using语句可用于实现IDisposable接口的任何对象。

在DataAdapter的Dispose()方法中,在放置对象之前关闭连接。 正确使用它会是这样的。

Public Function GetDT(ByVal SqlQuery As String, ByVal ConString As String) As DataTable
    Using da As New MySql.Data.MySqlClient.MySqlDataAdapter(SqlQuery, ConString)
        Dim ds As New DataSet
        da.Fill(ds)
        GetDT = ds.Tables(0)
        da.Dispose()   //because you are now using a 'Using' statement, this method is not necessary anymore.
        ds.Dispose()
        da = Nothing
        ds = Nothing
    End Using
End Function