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 语句替换该代码)
我有一个几十人用的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 语句替换该代码)