繁体   English   中英

MySqlException:从池中获取连接之前经过了超时时间

[英]MySqlException: The timeout period elapsed prior to obtaining a connection from the pool

异常信息:异常类型:MySqlException

异常消息:错误连接:超时已过期。 从池中获取连接之前已经过超时时间。 这可能是因为所有池化连接都在使用中,并且达到了最大池大小。

以上是我在事件查看器中遇到的错误。 此异常似乎仅发生在我们的开发服务器上。 这是一个内部仓库管理和私人公司网上商店。 在给定的时间我们只有不到100个用户,这是我的理解:

  • 无法打开连接,因为打开的线程太多。

我为解决该问题所做的事情:

  • 强制启用“ Pooling = True;” 在应用程序的连接字符串中。
  • 强制“最大池大小= 1000;” 在应用程序的连接字符串中。
  • 在MySQL Administrator中,将连接线程的空闲寿命从8小时减少到2小时。
  • 将MySQL Administrator中允许的最大连接数增加到1000。

这似乎仍然会引起相同的问题,我目前处于机智状态。 为了解决这个问题,我杀死了线程超过一两个小时的用户。我监测到这些崩溃期间最多只有108个连接。 有40个IDLE线程时,它停止接收连接的特定时间。

以下是用于进行交易的代码。

   /// <summary>
   /// Begin a database transaction.
   /// </summary>
   /// <returns>The database connection.</returns>
    public DbTransaction BeginTransaction()
    {
        if (_DbConnection.State != ConnectionState.Open)
        {
            _DbConnection.Open();
        }
        return _DbConnection.BeginTransaction();
    }

    /// <summary>
    /// Commit a database transaction.
    /// </summary>
    /// <param name="transaction">The database connection.</param>
    public void CommitTransaction(DbTransaction transaction)
    {
        if (transaction != null)
        {
            transaction.Commit();
            transaction.Dispose();
        }
        if (_DbConnection != null)
        {
            _DbConnection.Close();
        }
    }

    /// <summary>
    /// Rollback a database transaction.
    /// </summary>
    /// <param name="transaction">The database transaction.</param>
    public void RollbackTransaction(DbTransaction transaction)
    {
        if (transaction != null)
        {
            transaction.Rollback();
        }
    }

修改连接字符串后,请尝试实际保存它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM