【问题标题】:Handling error timeout expired. Max pool size connection was reached in vs 2005处理错误超时已过期。与 2005 年相比,已达到最大池大小连接
【发布时间】:2014-01-16 13:29:43
【问题描述】:

很抱歉这篇主流帖子。在对这个问题进行了长时间的挖掘之后,我还没有真正找到解决方案。许多可能引发此问题的原因。 所以我提出这个帖子来请求一些理解。

我正在操作数据库.. 将它们填充到数组中、列出、比较,然后将它们再次存储在数据库中。在所有这些过程中,我使用了许多查询,例如 ExecuteScalarMysqlCommand,导致在 module.vb 中创建了很多 new mysqlcommand

我使用 vb.net 和 xampp mysql 作为数据服务器.. 我有 2 个数据库:它们相同但大小不同..

问题是:当我测试第二个数据库时(记录量较小) 我的程序运行良好,没有延迟或超时错误`

但是当我用我的第一个数据库(有 4900 条记录)更改数据源时,timeout expired 直接弹出,导致我的 vs 2005 没有响应

根据我对谷歌的研究,我发现这个错误的解释很少

  1. vs 2005 仍然有一个错误,那就是timeout expired。解决方案是升级 vs 版本

  2. 由于尝试在同一服务器上打开同一连接而引发的错误。

  3. 此错误消息与它所说的并不完全一致。它告诉您连接已满,但实际上连接的插槽仍然可用

  4. 我使用了太多的mysqlcommand 变量,就像我在module.vb 中一样,多达50 个mysqlcom 和变量!!!

我的个人意见:我不能应用第一个解决方案。如果我将它升级到 vs 2010 或更高版本,我的程序会有很多错误

对于第二种解决方案:我真的不明白那是什么意思。我认为那是因为我试图再次打开同一个连接(例如 CMD_open1.executereader),但同一个连接已经打开并且尚未关闭

在我的程序中,我已经确保每次使用 CMD.execute 阅读器或 executenonquery 或执行标量时,我都会添加 CMD name.connection.dispose(),以便在打开另一个新连接之间正确关闭连接

所以我现在的问题是

  1. 我所有的个人猜测都正确吗?如果不是,请告诉我正确的那些
  2. 基于我的问题,我个人认为原因是我使用了太多mysqlcommand,即使我每次使用时都关闭了连接。那是对的吗?对此的正确解释是什么?
  3. 什么是我可以应用来解决我的问题的正确解决方案?

感谢阅读。我真的很想知道这个问题的答案。

这是我的 module.vb 的 ss,其中包含许多 mysqlcommand 变量

【问题讨论】:

    标签: mysql vb.net error-handling


    【解决方案1】:

    看起来您需要进行一些认真的重构。

    与数据库相关的对象昂贵。你实例化的越多,你付出的性能损失就越多。它们也是稀缺。您最终会用完(迟早)。您需要非常谨慎地使用它们,并确保在完成后适当地清理它们。

    许多程序员将所有与数据库相关的对象放入(基本上)一个处理所有清理等的函数中:

    Private Function RunQuery( ByVal procName As String ) As DataTable
        Using l_connection = new MySqlConnection("connection info")
            Using l_command = New MySqlCommand( procName )
                l_command.CommandType = StoredProcedure
    
                ' ... etc ...
    
                Return l_results
            End Using
        End Using
    End Function
    

    Using 块确保在每次调用后正确清理数据库对象(调用适当的CloseDispose 函数)。

    但听起来您已经获得了一些关于潜在问题的好建议。您提供的清单几乎是我推荐的。由您来测试和调试以确定是哪一个导致了问题。

    另外,mainstream support for Visual Studio 2005 ended in 2011。如果你懒得升级你的工具来修复已知的错误(因为这对你来说工作量太大了),那么关于这个主题就没有什么可说的了,“当你遇到错误。”

    【讨论】:

    • 哦,你是对的..我忘了问..哪个更好?关闭与功能或处置的连接?还有CMD.connection.dispose()CMD.connection.close 的区别是什么。每次我使用连接时,我总是用dispose 关闭它,而不是两者都用。什么是最合适的方式?
    • @SoniGunz - 关闭就足够了。 Dispose 调用关闭。最佳做法是在Using Statement 中使用资源密集型对象以保证正确处置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多