【发布时间】:2017-04-06 00:13:17
【问题描述】:
我的 VB.NET 应用程序开始收到错误:
超时。在从池中获取连接之前超时已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。
我确实有一些方法没有正确处理连接。这些已使用Try 和Finally 修复。
但是,今天早上我在尝试打开简单报告时再次收到错误消息。我有 MySQL Workbench 打开监视客户端连接。当时我连接了 4 个线程。
MySQL DB 会终止休眠超过 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
【问题讨论】:
-
在使用连接的任何地方都使用
Using-statement。这意味着,只能在方法范围内使用它们,并且永远不要共享它们。 -
正如@TimSchmelter 之前所说,在处理数据库连接时尝试使用
using,以避免任何可能保持打开状态的连接出现问题。顺便说一句,问题可能是由任何花费太长时间并且使用transaction锁定任何表的进程引起的。您是否检查过是否有任何进程可能会锁定您尝试使用的表? -
谢谢。我没有在项目的任何地方明确实现任何事务方法。我会将代码转换为
using似乎确实有一个线程处于打开状态并且睡眠时间超过了应有的时间。但是,我会认为有 151 个可能的连接,这不会是罪魁祸首吗? -
听起来您并没有在使用后处理掉您的连接。服务器杀死休眠线程不会影响连接轮询(Workbench 将无法看到)
-
@Plutonix 有没有办法查看投票中的实际连接数?