我们知道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状态时,没有连接接近的地方。请查看下图。
任何人都可以帮我这个吗?
由于
答案 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