gpt4 book ai didi

mysql - vb net max_user_connections 到 mysql

转载 作者:行者123 更新时间:2023-11-30 22:50:06 24 4
gpt4 key购买 nike

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

关于mysql - vb net max_user_connections 到 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28427288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com