Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已达到最大池大小。Sql Server,c#_C#_Sql Server_Asynchronous_Connection Pooling - Fatal编程技术网

已达到最大池大小。Sql Server,c#

已达到最大池大小。Sql Server,c#,c#,sql-server,asynchronous,connection-pooling,C#,Sql Server,Asynchronous,Connection Pooling,我遇到以下异常:“超时已过期。”。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用,并且在我的ASP.NET Framework 4.7.2应用程序中达到了最大池大小。我试图调查我的代码中的连接泄漏问题,我认为这是代码中的异步调用中的一个错误,导致连接无法关闭 简洁:v1.60.6。 连接字符串:数据源=数据源;初始目录=目录;持久安全信息=True;用户ID=登录;密码=密码;multipleactiveresultsets=true;连接超时=300;最大池大小=200 创建

我遇到以下异常:“超时已过期。”。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用,并且在我的ASP.NET Framework 4.7.2应用程序中达到了最大池大小。我试图调查我的代码中的连接泄漏问题,我认为这是代码中的异步调用中的一个错误,导致连接无法关闭

简洁:v1.60.6。 连接字符串:
数据源=数据源;初始目录=目录;持久安全信息=True;用户ID=登录;密码=密码;multipleactiveresultsets=true;连接超时=300;最大池大小=200

创建SqlConnection实例的代码(GetConnectionString()方法返回上面指出的字符串):

protected async Task<T> WithConnection<T>(Func<IDbConnection, Task<T>> getData)
        {
            try
            {
                using (var connection = new SqlConnection(GetConnectionString()))
                {
                    return await getData(connection); // Asynchronously execute getData, which has been passed in as a Func<IDBConnection, Task<T>>
                }
            }
            catch (TimeoutException ex)
            {
                throw new Exception($"{GetType().FullName}.WithConnection() experienced a SQL timeout", ex);
            }
            catch (SqlException ex)
            {
                throw new Exception($"{GetType().FullName}.WithConnection() experienced a SQL exception (not a timeout)", ex);
            }
        }
带连接的受保护异步任务(Func getData)
{
尝试
{
使用(var connection=newsqlconnection(GetConnectionString()))
{
return wait getData(connection);//异步执行getData,它已作为Func传入
}
}
捕获(TimeoutException例外)
{
抛出新异常($“{GetType().FullName}.WithConnection()遇到SQL超时”,ex);
}
catch(SqlException-ex)
{
抛出新异常($“{GetType().FullName}.WithConnection()遇到SQL异常(不是超时)”,例如;
}
}
此方法的用法:

public async Task<IEnumerable<User>> GetUsersAsync(Filter filter, Config config)
        {
            const string storedProcedure = "[dbo].[GetUsers]";

            var parameters = new DynamicParameters();
            parameters.Add("@param1", config.Value, DbType.String);
            parameters.Add("@param2", filter.Value, DbType.String);

            return await WithConnection(async c => await c.QueryAsync<User>(storedProcedure, parameters, commandType: CommandType.StoredProcedure));
 }
public异步任务GetUsersAsync(过滤器过滤器,配置)
{
常量字符串storedProcedure=“[dbo].[GetUsers]”;
var参数=新的DynamicParameters();
parameters.Add(“@param1”,config.Value,DbType.String);
parameters.Add(“@param2”,filter.Value,DbType.String);
返回await with connection(异步c=>await c.QueryAsync(storedProcedure,参数,commandType:commandType.storedProcedure));
}

您是否检查了打开的连接数?您可以使用async/await,但
WithConnection
似乎只不过是在信息较少的情况下重新浏览。我怀疑代码中还有其他问题-为什么要使用
QuerySync
?为什么要显式指定参数而不是使用匿名代码s type,如果大小或类型没有改变?其他事情也在发生,导致连接泄漏。是否应该在某个地方有
连接。Open()
?或者如果Dapper自动执行此操作,则考虑此注释未写入:-)@PanagiotisKanavos,例如使用
对象
,我已经为用户编辑了对象类型,现在可能更清楚了。第二个我不太明白的问题是什么?使用匿名类型而不是Dapper的动态参数有什么区别?或者什么时候我可以得到更多关于它的信息?@PrebenHuybrechts谢谢你的SQL脚本。我将使用它。你检查过有多少连接打开了吗?您可以使用async/await没有什么问题,但是
with connection
似乎只不过是用较少的信息重新播放。我怀疑代码中还有其他问题-为什么要使用
QueryAsync
?如果大小或类型不变,为什么要显式指定参数而不是使用匿名类型?还有一些事情正在发生,导致连接泄漏。是否应该在某个地方有
连接。Open()
?或者,如果Dapper自动执行此操作,那么考虑到此注释未写入:-)@PanagiotisKanavos,
object
被用作用法示例,我已经为用户编辑了对象类型,现在可能更清楚了。第二个我不太明白的问题是什么?使用匿名类型而不是Dapper的动态参数有什么区别?或者什么时候我可以得到更多关于它的信息?@PrebenHuybrechts谢谢你的SQL脚本。我会用的