vb 净 max_user_connections 到 mysql

vb net max_user_connections to mysql

我有一个几十人用的pc程序,随着连接数据库的人越来越多,程序开始抛出大量数据库连接的错误。我在每个查询创建一个进程后检查数据库,该进程在数据库中为 "sleep" 如果超过数字 50 是上述错误崩溃。如果问题出在程序或托管上,我该如何补救?

数据库屏幕;

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

使用数据库连接时,应特别注意正确关闭和处理这些连接。如果你没有正确地做到这一点,你最终会得到你的程序保留的陈旧连接,并且永远不会被 ADO.NET 的池基础设施重用(参见 ADO.NET Connection Pooling

上面示例中的代码已经进行了所有检查,应该不是问题的原因,但是,您确定程序中的每个地方都遵循相同的模式而没有忘记处理所涉及的对象吗?

using statement 在这里是一个救星,因为即使在出现异常的情况下,您也可以确保 using 语句所包含的对象已关闭并处置,将任何非托管资源返回给系统。

另一个问题是您构建 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 语句替换该代码)