2015-02-10 5 views
1

У меня есть компьютерная программа, используемая десятками людей, и с увеличением числа людей, подключающихся к базе данных, программа начала выдавать ошибку с большим количеством подключений к базе данных. Я проверил базу данных после того, как каждый запрос создает процесс, который находится в базе данных как «спящий», если вы превысили число 50, это вышеописанная ошибка сбоя. Как я могу исправить это, если проблема связана с программой или хостингом?vb net max_user_connections to mysql

Экран базы данных;

http://obrazki.elektroda.pl/5375287900_1423553806.png

Код:

Public Sub loginUser(ByVal sql As String) 
    Try 
     Dim maxrow As Integer 
     con.Open() 
     dt = New DataTable 
     With cmd 
      .Connection = con 
      .CommandText = sql 
     End With 
     da.SelectCommand = cmd 
     da.Fill(dt) 
     maxrow = dt.Rows.Count 
     If maxrow > 0 Then 
      Form1.Show() 
     Else 
      Label3.Text = ("Invalid Username or Password!") 
      Label3.Visible = True 
     End If 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
    con.Close() 
    da.Dispose() 
End Sub 


Private Sub InsertData() 

    sql = "SELECT * from users WHERE login = '" & (username.Text) & "' and pass = '" & StringtoMD5(password.Text) & "'and banned = '" & 0 & "'" 
    loginUser(sql) 

End Sub 
+0

Использование глобальных переменных для сохранения объекта соединения является основным виновником ваших проблем. Не делай этого. Используйте локальный объект подключения, откройте его и удалите, когда закончите. – Steve

+0

Я не знаю, как это сделать, если я могу попросить пример такого соединения? –

ответ

0

При использовании соединения с базой данных специального ухода следует использовать, чтобы правильно закрыть и утилизировать эти соединения. Если вы не сделаете это правильно, вы получите устаревшие соединения, хранящиеся в вашей программе, и никогда не будете повторно использоваться инфраструктурой объединения ADO.NET (см. ADO.NET Connection Pooling)

Код в приведенном выше примере содержит все проверки и не должно быть причиной ваших проблем, но, вы уверены, что каждый раз, когда в вашей программе вы будете следовать одной и той же схеме, не забывая распоряжаться задействованными объектами?

using statement является спасателем жизни, потому что, ДАЖЕ в случае исключений, вы можете быть уверены, что объекты, заключенные с помощью инструкции, закрыты и расположены, возвращая все неуправляемые ресурсы обратно в систему.

Еще одна проблема заключается в том, как создавать команды SQL, объединяющие строки. Это приводит непосредственно к атакам SQL Injection и очень плохому стандарту безопасности для вашего приложения.

Сказал, что, я думаю, вы должны изменить способ loginUser к чему-то вроде этого

Public Sub loginUser(ByVal sql As String, ByVal parameterList as List(Of MySqlParameter)) 
    Try 
     Dim maxrow As Integer 

     ' local variables for connection, command and adapter... ' 
     Using con = new MySqlConnection(..connstring here..) 
     Using cmd = con.CreateCommand() 
      con.Open() 
      With cmd 
       .Connection = con 
       .CommandText = sql 
       .Parameters.AddRange(parameterList.ToArray()) 
      End With 
      Using da = new MySqlDataAdapter(cmd) 
       Dim dt = New DataTable 
       da.Fill(dt) 
       maxrow = dt.Rows.Count 
       If maxrow > 0 Then 
       Form1.Show() 
       Else 
       Label3.Text = ("Invalid Username or Password!") 
       Label3.Visible = True 
       End If 
      End Using 
     End Using 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

И называть его

Private Sub InsertData() 

    sql = "SELECT * from users " & _ 
      "WHERE login = @uname " & _ 
      "AND pass = @pwd " & _ 
      "AND banned = '0'" 
    Dim parameterList = new List(Of MySqlParameter)() 
    parameterList.Add(new MySqlParameter("@uname", MySqlDbType.VarChar)) 
    parameterList.Add(new MySqlParameter("@pwd", MySqlDbType.VarChar)) 
    parameterList(0).Value = username.Text 
    parameterList(1).Value = StringtoMD5(password.Text) 
    loginUser(sql, parameterList) 

End Sub 

Как я уже сказал, только это изменение в одиночку, вероятно, не исправить вашу проблему. Вы должны попытаться найти в своей программе, где у вас есть ситуация, когда соединение неправильно закрыто и удалено. (и, по крайней мере, замените этот код на оператор using)

+0

Спасибо за помощь, но вы объясните мне, что такое список параметров? Что я поставил на этом месте? –

+0

screenshot http://s3.postimg.org/tgs2a28ir/rttrt.png –

+0

Извините, синтаксис C#, я исправлю ответ как можно скорее – Steve

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