Состояние соединения MySQL не работает должным образом
У меня есть форма заявки, написанная на 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 минут и снова нажимаю кнопку2. Он передает "checkConn" без ошибок и говорит, что connectiontate "открыт", но, когда дело доходит до строки "cmdCheck.ExecuteNonQuery()", возникает исключение: "Fatal error...". Проблема в том, что состояние соединения (в checkConn()) сообщает о Connection.Open, хотя это не так (я проверял на сервере - он закрыт из-за периода бездействия). Есть ли лучший способ проверить состояние соединения?
1 ответ
Вы не первый человек, которого я видел, используя такой метод. Не. Это плохо. Просто создайте и уничтожьте объекты подключения, как и где они вам нужны. Избавиться от 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 минут без передачи данных по нему большую часть времени, вы делаете это неправильно.