Я использую следующий код в модуле, который затем я могу позвонить из любого места в программе для управления моим mysql database connection.
. Я просто вызываю dbExecute, а затем его очередь должна открывать соединение БД с помощью оператора manageConnection(true)
, а затем закрыть соединение с помощью manageconnection(false).
. Проблема, с которой я столкнулась, заключается в том, что после утверждения dbC.Close соединение с БД никогда не падает, поэтому я просто накапливаю соединения до тех пор, пока max не ударит по 104, а затем я получаю ошибку подключения. Я попытался добавить dbC.dispose, dbC = Nothing
и ничего в этом заявлении else для CloseConnection seems to matter.
Соединения остаются открытыми. Мне интересно, если это потому, что я передаю свой msr в dbExecute ByRef
, поэтому он держит соединение открытым для этого набора данных? Если да, то как я могу работать, чтобы вернуть DataReader обратно к вызывающей процедуре? Я пытаюсь управлять связями DB после каждого вызова БД, но в настоящее время не очень хорошо работает! Надеюсь, что другой набор глаз поможет мне понять мою проблему.vb.net - соединения Mysql не закрываются с помощью подпрограмм Sub
Я использую следующий пример того, как я называю DB соединение в настоящее время: 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
У кого-нибудь есть идеи? Если я не могу закрыть соединение, я думаю, что просто попробую открыть его один раз, когда программа откроется, и удерживайте ее нажатой, пока программа не закроется. Я чувствовал, что могу сделать лучше, чем это, хотя и по-прежнему разделять код на модули/классы, поэтому вызовы БД были короткими в середине другого кода. Даже если вы не можете ответить на этот оригинальный вопрос, я был бы открыт для того, как вы обрабатываете свой открытый DB и закрываете его с помощью mysql. – inthemaetricks