我在Windows Server 2008机器上运行SQL Server 2008 R2 SP1。我有一个从Visual Studio 2010运行的.NET脚本,它执行以下操作:


进入数据库
进行更改
迭代

迭代的总次数为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


我不确定在其他地方应该检查,我知道我在这里有很多活动部件,但是我感到自己只是在某处缺少最大池设置。

评论

您可以发布连接字符串吗?请看我的回答。那应该是您的补救方法(此值将在连接字符串中指定。System.Data.SqlClient的默认值为100,这就是为什么您看到连接池已用尽的原因。)

#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()块中实现finallytry/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