MySQL 连接状态未按预期工作

标签 mysql vb.net database-connection

我有用 vb.net 编写的表单应用程序。它使用 MySqlClient:

Imports MySql.Data.MySqlClient

Public Class frmTest
Dim AConn As MySqlConnection
Dim errMsg as String = ""

Sub New()
    Try
        'Opens connection as forms open and keep it open
        If checkConn() = False Then Throw New Exception(ErrMsg)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Private Function checkConn() As Boolean
    Try
        'if connection is not initiated then initiate
        If IsNothing(AConn) Then AConn = New MySqlConnection(ConnSTR)

        'if connectionstate is any other than "open", reconnect  
        If AConn.State <> ConnectionState.Open Then
            closeConn()
            AConn.Open()
        End If

        Return True
    Catch ex As Exception
        ErrMsg = ex.Message
        Return False
    End Try
End Function

Sub closeConn()
    Try
        AConn.Close()
    Catch ex As Exception

    End Try
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles 
            Button2.Click
    Try
        If checkConn() = False then Throw New Exception(errMsg)
        Dim cmdCheck As New MySqlCommand("show databases;", AConn)
        cmdCheck.ExecuteNonQuery()
    Catch ex as Exception
        MsgBox(ex.Message)
    End Try
End Sub
End Class

现在,当我打开表单时,它工作正常。连接打开,通过单击我得到结果。然后,我将表单闲置 10 分钟,然后再次单击“button2”。 它毫无错误地传递“checkConn”,并且表示连接状态为“打开”,但是,当涉及“cmdCheck.ExecuteNonQuery()”行时,异常会抛出:“ fatal error ...”。问题是连接状态(在 checkConn() 中)报告 Connection.Open,尽管它不是(我在服务器上检查 - 由于不活动期间它已关闭)。 有没有更好的方法来检查连接状态?

最佳答案

你不是我见过的第一个使用这种方法的人。不。这不好。只需根据需要创建和销毁连接对象即可。摆脱 AConn 字段和 checkConn 方法,并按如下方式执行:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Try
        Using AConn As New MySqlConnection(ConnSTR)
            Dim cmdCheck As New MySqlCommand("show databases;", AConn)
            AConn.Open()
            cmdCheck.ExecuteNonQuery()
        End Using
    Catch ex as Exception
        MsgBox(ex.Message)
    End Try
End Sub

有时使用字段来保存对 ADO.NET 对象的引用是个好主意。这不是那些时代之一。默认情况下应该根据需要创建 ADO.NET 对象。

ADO.NET 连接对象存在于较高级别,而实际的数据库连接存在于较低级别。 ADO.NET 连接专门用于在需要时创建、尽可能晚地打开并尽早关闭。 ADO.NET 为您管理底层数据库连接。如果您打开了一个 ADO.NET 连接对象 10 分钟,而大部分时间都没有数据通过它,那么您就做错了。

关于MySQL 连接状态未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52016850/

相关文章:

vb.net - 如何动态工具提示或在一个按钮上更改工具提示

java - 在 Java 中检测操作系统 sleep 和唤醒事件

php - PDO 连接 : UTF-8 declaration with SET NAMES/CHARACTER SET?

php - 限制从 SQL 数据库中提取的行数并组织成页面

mysql - 在 MySQL 中将 NULL 结果包含为 0

mysql - 在 mySQL 中选择两个表中最接近的时间戳?

python - 我应该尽量减少 Pony ORM 中 db_session 的使用吗? db_session 的目的是什么?

php - mysql连接第三个表,其中FK未直接链接

c# - WPF:如何在运行时更改 CurrentUICulture

c# - 如何显示/隐藏另一个应用程序的窗口?