进入数据库
进行更改
迭代
迭代的总次数为150,但是它在100个连接处停止,我不知道为什么。我可以将脚本调整为仅使用一个线程,但是我更想知道我缺少最大连接设置的地方,因为这对于以后的参考会更有用。
这里是到目前为止,我已经检查过:
Visual Studio 2010中的SQL连接字符串(设置为1000)
SSMS数据库实例连接属性(设置为0 [infinity]用户连接)
在Server 2008上搜索了一些信息,看起来它可以处理100个以上的连接。
在
SP_WHO2
旁边逐步浏览了我的代码,它提供了有关逻辑连接的更多信息,可以看到连接数从52开始和152个逻辑连接处出现“达到最大池连接数”错误的脚本错误。将连接字符串更改为使用
Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
我不确定在其他地方应该检查,我知道我在这里有很多活动部件,但是我感到自己只是在某处缺少最大池设置。
#1 楼
默认情况下,SQL Server最多允许32767个连接。可以使用sp_configure
进行更改。要查看此设置的当前配置,请使用以下查询:select * from sys.configurations
where name ='user connections'
默认情况下,您应该看到的最大值为32767,
value_in_use
等于0(使用默认值设置)。如果对此进行了更改,则可以按照链接中的描述重新配置SQL Server以使用其他值。还应检查实际建立了多少连接,因为应用程序外部可能会有更多活动(或者您的应用程序正在建立比您想象的更多的连接)。您可能需要查看常规统计信息-> perfmon中的逻辑连接或查询
sys.dm_os_performance_counters
中的值(cntr_value将显示当前时间点值):select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
评论
是的,我已经检查了用户连接(这是我要做的第一件事,并且最容易在UI和Microsoft文档中找到。我也逐步浏览了代码,并通过以下方式关注通过SSMS进行逻辑连接的数量:使用SP_WHO2,它提供了大量有关逻辑连接的信息。空闲时,我的服务器有51个连接。当脚本失败时,它又建立了100个连接。这就是我现在所处的位置。
–西恩·朗(Sean Long)
13年10月8日在16:34
我通过采取的步骤进一步澄清了我的问题。它可能根本不是SQL中的设置,这就是为什么我开始查看Windows和Visual Studio设置的原因。
–西恩·朗(Sean Long)
13年10月8日在16:37
如果您已检查所有内容,但在100个连接上仍然失败,则答案不在数据库设置之内。仅供参考,这51个连接都是系统进程(您自己为+1)。
–迈克·法尔(Mike Fal)
13年10月8日在16:37
只是为了提供某种结束语,最后的评论最终是正确的。我仔细研究了为什么要创建这100个连接,并发现代码中有泄漏。修复后,它可以正常工作。尽管上述信息仍然非常有用,但我希望其他人也会发现它也有用。
–西恩·朗(Sean Long)
13-10-10 13:52
答案与sp_who2有何不同?
–塔尔C
20年6月23日在7:46
#2 楼
在连接字符串中,指定max pool size=<your desired max pool size>
。因此,换句话说,如果您要将最大池大小更改为值500,则您的连接字符串可能类似于:"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"
显然,我假设您的其他参数,但这应该可以使您更好地进行操作。连接池是客户端提供程序强制实施。客户端将需要通过连接字符串指定此最大池大小设置。
此外,请确保正确关闭或处置连接,否则将占用连接。这样的东西(C#):
string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";
using (SqlConnection dbConn = new SqlConnection(connectionString))
{
using (SqlCommand sqlCmd = new SqlCommand())
{
sqlCmd.Connection = dbConn;
sqlCmd.CommandText = "select 1;";
// ... so on and so forth
}
}
using
块(在C#中)在完成时调用IDisposable.Dispose()
。您还可以在SqlConnection.Dispose()
块的SqlConnection.Close()
块中实现finally
或try/catch/finally
。参考:SqlConnection.ConnectionString属性上的MSDN文档
评论
这是连接字符串,也更新了我的问题。数据源= PerfSQL02;初始目录=已屏蔽;集成安全性=真;最大池大小= 1000
–西恩·朗(Sean Long)
13年10月8日在16:50
那连接字符串到处都是吗?我问的原因是因为不同的连接字符串将成为不同的连接池。
–托马斯·斯金格
13年10月8日在16:58
这是一个非常非常好的问题。到目前为止,我检查了3个连接字符串,但是它们都在努力争取最大的最大缓冲池。我将看看是否可以找到其他可能导致它的字符串。
–西恩·朗(Sean Long)
13-10-8在17:17
如果仅调试执行,则应该能够查看SqlConnection.ConnectionString的运行时值对于特定操作的含义。那将是最简单的方法。如果最大池大小不存在,则为100。
–托马斯·斯金格
13-10-8在18:29
应该将其标记为已接受的答案,因为它实际上可以正确回答OP。他提到客户端conn字符串“最大池大小”参数和关闭/释放连接的需求。
–亚当·卡夫尼斯(Adam Caviness)
17年12月20日在16:15
评论
您可以发布连接字符串吗?请看我的回答。那应该是您的补救方法(此值将在连接字符串中指定。System.Data.SqlClient的默认值为100,这就是为什么您看到连接池已用尽的原因。)