[英]vb.net - Mysql connections are not closing using Sub routines
我在模块中使用下面的代码,然后可以从程序中的其他任何地方调用该代码来管理我的mysql database connection.
我只调用了dbExecute子项,然后依次使用了manageConnection(true)
语句来打开数据库连接,然后使用manageconnection(false).
关闭该连接manageconnection(false).
我遇到的问题是,在dbC.Close语句之后,与数据库的连接永远不会断开,因此我只是累积连接,直到最大值达到104,然后出现连接错误。 我试图添加dbC.dispose, dbC = Nothing
并且在CloseConnection seems to matter.
else语句中CloseConnection seems to matter.
dbC.dispose, dbC = Nothing
任何CloseConnection seems to matter.
连接保持打开状态。 我想知道是否是因为将msr传递给dbExecute ByRef
,所以它保持该数据集的连接打开? 如果是这样,如何解决将DataReader传递回调用过程的问题? 我正在尝试在每次数据库调用后管理我的数据库连接,但目前在此方面做得不好! 希望另一双眼睛可以帮助我理解我的问题。
我以以下示例为例,说明如何立即调用数据库连接:Public Class frmLogin
Dim db As New DBCon
Dim msr As MySqlDataReader = Nothing
Dim Query As String
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnCheckConn.Click
Query = "Select username from db.userstable"
db.dbExecute(Query, msr)
******以下是模块代码****************
导入MySql.Data.MySqlClient
公共类DBCon
Dim dbC As MySqlConnection
Public Sub ManageConnection(ByVal CloseConnection As Boolean)
Try
dbC = New MySqlConnection("server=localhost; userid=****; password=****; database=****;")
If CloseConnection = True Then
If dbC.State = ConnectionState.Closed Then _
dbC.Open()
Else
dbC.Close()
End If
Catch ex As Exception
MsgBox("DB Connection failure:" & ex.Message)
End Try
End Sub
Public Sub dbExecute(ByVal q As String, ByRef msr As MySqlDataReader)
Try
ManageConnection(True) 'Open connection'
Dim msc As New MySqlCommand(q, dbC)
msr = msc.ExecuteReader
ManageConnection(False) 'Close connection'
Catch ex As Exception
MsgBox("Error " & ex.Message)
End Try
End Sub
在下面尝试了用户建议,在查看mysql workbench-performance-client连接时仍然看到连接挂起。 因此,我将ManageConnection代码更改为以下代码,以进行测试,并直接将其称为:dbCon.ManageConnection(true)。一旦.open行触发,我便看到与mysql的新连接,但是.close,.dispose和=没有线不会清除该连接。 我在mysql中设置了错误吗? 如果.open创建了一个新的连接,我不确定为什么.close的下一行不会摆脱它。 我确实相信这是我问题的根源。 希望以前有人遇到过这种情况。 让我知道你的想法。
Public Sub ManageConnection(ByVal CloseConnection As Boolean)
Try
If CloseConnection = True Then
dbC = New MySqlConnection("server=localhost; userid=****; password=****; database=dbname;")
dbC.Open()
dbC.Close()
dbC.Dispose()
dbC = Nothing
Else
dbC.Close()
dbC.Dispose()
End If
Catch ex As Exception
MsgBox("DB Connection failure:" & ex.Message)
End Try
有几种方法可以应对这些数据库连接泄漏。 Using ... End Using
可能是最好的。 但是,完成连接对象后,也可以执行dbC.Dispose()
或set dbC = Nothing
。
关键是在完成连接对象后,一定要Dispose()
连接对象。 即使您的程序遇到异常, Using
也会为您执行此操作。
在主程序中尝试类似的操作。 并停止使用该ManageConnection
子。 实际上可以保证泄漏连接。
Using dbC as New MySqlConnection("server=localhost; userid=****; password=****; database=****;")
Dim msc As New MySqlCommand(q, dbC)
msr = msc.ExecuteReader
...
End Using
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.