我的VB.NET应用程序开始收到错误:
超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
我确实有一些方法没有正确处理连接。这些已使用Try
和Finally
修复。
然而,今天早上我在尝试打开简单报告时再次收到错误。我有MySQL Workbench开放监控客户端连接。那时我连接了4个线程。
MySQL数据库会杀死已经睡眠超过15秒的连接。
我不知道如何达到最大池大小,如果确实是错误所指的那样。
应用程序是否读取最大池大小设置并保持自己的连接数并在达到该数量时抛出错误,或者每次打开新连接时是否直接从MySQL DB获取数字?
或者错误可能是由于其他原因造成的?
编辑1
MySQL Workbench的一些统计数据
线程连接:3
线程运行:1
创建的主题:250
线程缓存:5
被拒绝(超过限制):0
总连接数:2822
连接限制:151
流产客户:2694
中止连接:84
错误:0
编辑2
调用和处理连接的示例代码:
Public Shared Function GetCoursePaperCertificate(ByVal CourseTypeID As Integer) As String
Dim connx As New MySqlConnection(My.Settings.BMConnString)
Try
Dim cmdTextx = "Select `Cert` From `Courses` WHERE `ID`=@ID"
Dim cmdx As New MySqlCommand(cmdTextx, connx)
cmdx.Parameters.AddWithValue("@ID", CourseTypeID)
connx.Open()
Dim result = cmdx.ExecuteScalar
If result Is Nothing OrElse result Is DBNull.Value Then
Return String.Empty
Else
Return result
End If
Catch ex As Exception
Return String.Empty
Finally
connx.Dispose()
connx = Nothing
End Try
End Function
答案 0 :(得分:1)
您的代码中有几件事情。
Option Strict
。声明该函数返回一个字符串,但您尝试使用Object
Return result
实现Dispose
方法的Using
块中使用。这允许您声明和初始化对象,使用它并在最后处置它。Parameters.Add
优于AddWithValue
。后者强制DB Provider根据数据猜测数据类型。DataTable
并对其进行查找,而不是一遍又一遍地查询数据库。核心问题(可能)是您没有处置DBCommand
对象。看看你使用的构造函数:
Dim cmdx As New MySqlCommand(cmdTextx, connx)
DBCommand
对象传递对连接的引用。即使您明确处置了该连接,cmdx
仍然有对它的引用,并且它没有被处理掉。 Using
块可以很容易地确定事情的处理方式:
Dim sql = "Select `Cert` From `Courses` WHERE `ID`=@ID"
Using dbCon As New MySqlConnection(MySQLConnStr)
Using cmd As New MySqlCommand(sql, dbCon)
cmd.Parameters.Add("@Id", MySqlDbType.Int32).Value = CourseTypeID
dbCon.Open()
Dim result = cmd.ExecuteScalar
If result Is Nothing OrElse result Is DBNull.Value Then
Return String.Empty
Else
Return result.ToString()
End If
End Using ' close, dispose of conn
End Using ' dispose of DBCommand
为了减少缩进,你可以"堆叠"将项目合并到一个Using
块中:
Using connx As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, connx)
...
End Using
请注意第一行末尾的逗号。
如果这不是泄漏的原因,我会感到惊讶(当然所有代码都需要更改)。