2015-12-15 4 views
1

Я использую следующий код в модуле, который затем я могу позвонить из любого места в программе для управления моим 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 
+0

У кого-нибудь есть идеи? Если я не могу закрыть соединение, я думаю, что просто попробую открыть его один раз, когда программа откроется, и удерживайте ее нажатой, пока программа не закроется. Я чувствовал, что могу сделать лучше, чем это, хотя и по-прежнему разделять код на модули/классы, поэтому вызовы БД были короткими в середине другого кода. Даже если вы не можете ответить на этот оригинальный вопрос, я был бы открыт для того, как вы обрабатываете свой открытый DB и закрываете его с помощью mysql. – inthemaetricks

ответ

1

Существует несколько способов устранения утечек данных. 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 
+0

Я полностью согласен с использованием использования. Я смотрел на ManageConnection Sub и с новой линией MySqlConnection за пределами оператора If, что делает новое соединение, даже когда вы пытаетесь закрыть открытое соединение. Таким образом, они просто складываются друг на друга (я ударил свой предел 256 с помощью SqlCeConnections с исходным кодом).Перемещая New MySqlConnection в оператор If, когда CloseConnection = true, он должен работать должным образом. Но опять же, я бы по-прежнему использовал использование вместо этого. – Capellan

+0

Благодарим вас за предложение. Единственные проблемы с этим - то, что когда я вызываю dbC.open, я намереваюсь использовать его из вызывающего Sub dbExecute, и поэтому, когда вы вернетесь к этому югу и нажмите эту строку: Dim msc As New MySqlCommand (q, dbC) dbC больше не является допустимым соединением. И он по-прежнему отображается как затяжное соединение на панели мониторинга mysql, которое я также не понимаю. – inthemaetricks

+0

Capellan Я попробую ваше предложение здесь через час или около того и сообщит вам об этом. Делает много смысла, что вы говорите. – inthemaetricks

Смежные вопросы