2015-02-10 45 views
1

我有幾十個人使用的pc程序,並且隨着人們連接到數據庫的增加,程序開始拋出大量數據庫連接的錯誤。我檢查數據庫後,每個查詢創建一個進程是在數據庫中的「睡眠」,如果你超過了數字50是上述錯誤崩潰。如果問題出在程序或託管上,我該如何補救?vb net max_user_connections到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 2015-02-10 08:42:27

+0

我不知道該怎麼做,如果我可以要求這樣一個連接的例子嗎? – 2015-02-10 09:06:47

回答

0

當使用數據庫連接應特別注意使用正確關閉和處理這些連接。如果你沒有正確地做到這一點,那麼你的程序會保持陳舊的連接,並且不會被ADO.NET的池化基礎架構重複使用(請參閱ADO.NET Connection Pooling

上例中的代碼包含所有檢查不應該是你的問題的原因,但是,你確定你的程序中的每一個地方你都遵循相同的模式,而不忘記處理相關的對象?

using statement在這裏是一個生命保護程序,因爲即使在例外的情況下,您也可以確定using語句所包含的對象是關閉的並將任何非託管資源返回給系統。

另一個問題是您構建SQL Commands串聯字符串的方式。這直接導致了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

感謝您的幫助,但您向我解釋什麼是參數列表?我在這裏放了什麼? – 2015-02-10 10:19:39

+0

截圖http://s3.postimg.org/tgs2a28ir/rttrt.png – 2015-02-10 10:25:46

+0

對不起,C#語法,我會修復答案asap – Steve 2015-02-10 10:28:28