超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
作者:C/S框架网|www.cscode.ne  发布日期:2020-04-08 16:30:33
  超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小

超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小


问题描述

最近有用户的系统偶尔提示“超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小” , 目前Max Pool Size = 512。


解决方案:


一、查看所有Connection连接,Open的连接必须都Close。


C# Code:


/// <summary>
/// 关闭SQL连接
/// </summary>
/// <param name="connection">当前连接</param>
public void CloseConnection(DbConnection connection)
{
  
if (connection != null)
  {
    
if (connection.State != ConnectionState.Closed) connection.Close();
    connection.Dispose();
//释放资源!
    
}
  }
  
  
//来源:C/S框架网 | www.csframework.com | QQ:23404761



二、如果访问量很大,加上Pooling=True;Max Pool Size=32767。SQLSERVER的最大连接数: 32767。


C# Code:

string connStr="Server=.;Database=CSFrameworkTest;User ID=sa;Password=test;pooling=true;connection lifetime=0;min pool size = 1;max pool size=32767";

//来源:C/S框架网 | www.csframework.com | QQ:23404761


三、若上面方法还是不能解决问题,把连接字符串Pooling=False,改为实时连接模式,确保每次访问数据库完成,把Open的连接都Close。


参考调用方法:


C# Code:


/// <summary>
/// 执行SQL语句并返回受影响的行数。
/// </summary>
/// <param name="DBName">帐套的数据库名</param>
/// <param name="command">SQL命令</param>
/// <returns></returns>
public int ExecuteSQL(string DBName, string SQL)
{
  SqlConnection connection
= this.CreateConnection(DBName);
  
try
  {
    SqlCommand cmd
= new SqlCommand(SQL, connection);
    cmd.CommandTimeout
= COMM_TIME_OUT;
    
int iValue = cmd.ExecuteNonQuery();
    
this.CloseConnection(connection);
    
return iValue;
  }
  
catch (System.Exception ex)
  {
    
this.CloseConnection(connection);
    
throw ex;
  }
}

//来源:C/S框架网 | www.csframework.com | QQ:23404761




C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务

上一篇 下一篇