MySQL连接池计数

时间:2016-11-22 10:47:45

标签: mysql .net vb.net

我的VB.NET应用程序开始收到错误:

  

超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。

我确实有一些方法没有正确处理连接。这些已使用TryFinally修复。

然而,今天早上我在尝试打开简单报告时再次收到错误。我有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

1 个答案:

答案 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

请注意第一行末尾的逗号。

如果这不是泄漏的原因,我会感到惊讶(当然所有代码都需要更改)。