vb.net - Mysql连接没有使用Sub例程关闭

时间:2015-12-15 12:29:53

标签: mysql vb.net database-connection

我在一个模块中使用下面的代码,然后我可以从程序中的任何其他地方调用来管理我的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

1 个答案:

答案 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