gpt4 book ai didi

c# - 达到最大连接池

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:20 26 4
gpt4 key购买 nike

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

System.InvalidOperationException: 'Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.'

我已经阅读了很多关于这个错误的帖子。他们都建议用 using block 包装您的代码,或者最后调用 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();
}

请注意,连接 的创建和打开 必须发生在抑制区域内部,它才会计数。

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

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


重要提示:禁止交易通常不是一个好主意;那笔交易是有原因的。此处的代码只是用于调查这是否是问题所在的诊断辅助工具。

关于c# - 达到最大连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49748789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com