我在一个模块中使用下面的代码,然后我可以从程序中的任何其他地方调用来管理我的mysql database connection.
我只是调用dbExecute子,然后依次打开数据库连接使用manageConnection(true)
语句,然后使用manageconnection(false).
关闭连接我遇到的问题是在dbC.Close语句之后,与DB的连接永远不会丢失所以我只是累积连接,直到最大命中率为止104然后我收到连接错误。我试图在dbC.dispose, dbC = Nothing
的其他声明中添加CloseConnection seems to matter.
并且没有任何内容。连接仍然保持打开状态。我想知道是不是因为我将我的msr传递给dbExecute ByRef
,所以它为该数据集保持连接打开?如果是这样,我如何解决将我的DataReader传递回调用过程?我试图在每次数据库调用后管理数据库连接,但目前还没有做好!希望另一双眼睛可以帮助我理解我的问题。
我正在使用以下内容作为我现在如何调用数据库连接的示例: 公共类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
Public Class 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
答案 0 :(得分:1)
有几种方法可以应对这些数据库连接泄漏。 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