【发布时间】:2021-08-21 18:48:29
【问题描述】:
我的服务出现连接池问题(已达到最大值),无论我在哪里尝试打开连接,我都会将其包装在 using 语句中以正确处理它,但我认为某些东西不允许它工作.我认为这是因为我使用的方法需要 SqlCommand 作为参数,这是一个示例:
private void QueryDB(string sConnString, SqlCommand oComm)
{
using (SqlConnection connection = new SqlConnection(sConnString))
{
try
{
connection.Open();
oComm.Connection = connection;
oComm.CommandTimeout = 2;
oComm.ExecuteNonQuery();
}
catch (SqlException e)
{
//log exception
}
catch (Exception e)
{
//log exception
}
}
}
之所以这样做是因为我需要在该方法之外组装参数,如下所示:
public void Example1()
{
using (SqlCommand command = new SqlCommand())
{
command.CommandText = "SELECT TOP 1 FROM Table ORDER BY column1 DESC";
QueryDB(_connString, command));
}
}
public void Example2()
{
SqlCommand command= new SqlCommand();
command.CommandText = "UPDATE Table set column1 = @value where column2 = @number";
command.Parameters.Add(new SqlParameter { ParameterName = "@value", Value = "someValue", SqlDbType = SqlDbType.VarChar });
command.Parameters.Add(new SqlParameter { ParameterName = "@number", Value = 3, SqlDbType = SqlDbType.Int });
QueryDB(_connString, command));
}
在Example1 中,我尝试处理SqlCommand,但我不知道它是否可以这样工作。另一件需要考虑的事情是,我每秒运行一个计时器,执行Example1 或Example2,我不知道这是否与问题有关,有时会发生 Max pool size 错误,而不是每天它会延迟其他查询。我可以做些什么来改善这种行为吗?谢谢
【问题讨论】:
-
尝试手动处理或尝试
SqlCommand.Cancel();和EndExecuteNonQuery(); -
命令执行需要多长时间?如果您每秒都运行它们并且它们花费的时间超过一秒,那么您可能会遇到问题,因为并行运行的数量太多。
-
与其传入
SqlCommand实例,不如考虑传入一个被调用以填充命令的委托,并在内部构造命令实例。 -
可能是您的应用程序有死锁堆积。在 SSMS 中连接到实例并使用 Monitor 视图查看活动查询和打开的连接。您应该能够检查状态。他们都在等待还是别的什么?这应该让您对实际发生的事情有更多的了解。
-
但是您在上面显示的问题中的代码不应保留任何打开的托管连接。 .net CLR 可能会汇集一些非托管连接,但如果您的应用执行正常,这些连接应该是最少的。
标签: c# sql-server sqlconnection sqlcommand