繁体   English   中英

达到最大连接池

[英]Max connection pool reached

我有一个简单的SQL语句,我想在短时间内调用几次(在<10秒内约400次调用)。 达到大约200次调用后,我收到以下SQL错误:

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

我已经阅读了一些有关此错误的帖子。 所有这些都建议using块包装代码或者最后调用SQL连接的.Close()方法。 我已经实现了两者,它仍然无法正常工作。 我没有正确实现它吗? (该方法在没有重复调用时工作正常)。

我的代码看起来像这样:

public static ObjectModel GetObject(int objGroupId, DateTime date)
{
    ObjectModel obj = new ObjectModel () { EffectiveFrom = date };

    // Get connection string from the App.Config file
    string connectionString = ConfigurationManager.AppSettings["ConnectionString"];

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        using (SqlCommand command = new SqlCommand("[dbo].[GetObjectData]", connection))
        {
            // Request the data which were in force on the specified date
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@Date", SqlDbType.DateTime).Value = obj.EffectiveFrom;
            command.Parameters.Add("@ObjecGrouptId", SqlDbType.Int).Value = objGroupId;

            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    int objId = reader.GetInt32NullIsZero("Id");
                    decimal value = reader.GetDecimalNullIsZero("value");
                    SetObjData(obj, objId, value);
                }
            }
        }

        connection.Close();
    }                

    return obj;
}

你展示的代码看起来干净; 所有正确的using等都在那里。 这让我怀疑此代码之外的东西是保持连接并占用池。 唯一知道的是这样的功能:环境事务,即TransactionScope

作为调试此假设的调试工具,我建议尝试抑制 TransactionScope (如果有),您可以通过以下方式执行:

using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        //... the rest of your code

        connection.Close();
    }                

    tran.Complete();
}

请注意, connection的创建和Open必须抑制区域内进行,以便对其进行计数。

如果这使问题消失,那么:环境事务导致所有连接在更广泛的事务中被登记 - 可能是DTC事务(因为LTM事务可以重新使用连接,IIRC)。

所以: 如果这样修复它,那么坦率地说我的建议是更改方法以允许您选择性地将连接作为输入传递,允许您为400个操作重用单个连接而不是依赖于连接池。


重要的是:抑制交易通常不是一个好主意; 那次交易是有原因的。 这里的代码只是一个诊断帮助来调查这是否是问题。

问题解决了。 事实证明,有一种(完全不同的方法)是async 我将其更改为Task (而不是void )并添加了await 所以@JeroenMostert走在了正确的轨道上。 我仍然不明白为什么异常总是发生在与async部分无关的方法中。

暂无
暂无

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

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