MySQL connectionstate 没有按预期工作
MySQL connectionstate doesn't work as expected
我有用 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" 没有错误,它说连接状态是 "open",但是,当涉及到行 "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 分钟而大部分时间没有数据通过它,那么您做错了。
我有用 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" 没有错误,它说连接状态是 "open",但是,当涉及到行 "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 分钟而大部分时间没有数据通过它,那么您做错了。