繁体   English   中英

vb.net-使用Sub例程未关闭MySQL连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM