SqlServer数据库连接数与客户端连接池关系测试(一)

  连接池连接数  

          DB连接数  

   峰值错误信息  

  连接峰值  

40000

0(32767)

   ?

3000

0(32767)

40000

3000


主要测试上面的结果,不多说了,直接操作吧!

测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace dbConnectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int maxCount = 40000;
            string connstring = "Server=1card1-hzc;Database=mytest;User ID=sa;Password=sa;pooling=true;connection lifetime=0;min pool size = 1;max pool size=40000";

            List<SqlConnection> collection = new List<SqlConnection>();

            for (int i = 0; i < maxCount; i++)
            {
                Console.WriteLine(string.Format("已创建连接对象{0}", i));
                try
                {
                    var sqlConn = new SqlConnection(connstring);
                    sqlConn.Open();
                    collection.Add(sqlConn);//保存连接对象
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
    }
}

查看数据库设置的最大连接数,[userconnections]  run_value=0(为0默认最大值32767



测试一:

设置max poolsize=40000,即连接池40000,数据库32767。执行脚本!



监控可以看到,峰值为32717,加上数据库系统自己的50个连接,总数为32767,即为数据库的最大连接数。

(在连接过程中,CPU和内存开销很大!)

 

在出错的情况下还继续创建对象,但是数据库连接数是没有增加的,连接对象都保存到连接池中,等待连接数据库。

当连接池连接数达到最大值时,如下图到达39999时,程序自动关闭退出!本人电脑几乎卡死!数据库连接数回到正常,数据库内存仍然很到,还是很卡!最后重启数据库服务释放内存!继续下面的操作。







测试二:

设置max poolsize=3000,即连接池3000,数据库32767。执行脚本!




连接池最大连接为3000,再新建连接时,因超时不能添加到连接池中,失败!

数据库当前最多可连接32767,现在只连接3000+系统session,为3019,还可以继续连接,只是连接池限制。

正常业务情况下,连接池会尽快处理没有用的连接,让客户端建立新的连接。

 

在数据库中,我删除1000sleepingsession

declare @i int
set @i = 1000
while @i<2000
begin
	exec('kill '+ @i)
	SET @i = @i + 1
end

数据库连接是降下来了,但是连接池还是没有降。因为心的连接还是无法通过连接池。所有也不要删除数据库中sleepingsession,因为连接池如果再重用连接的话,找不到数据库中的对应连接就断开了!






测试三:

这次设置max poolsize=40000,即连接池40000,数据库3000

 

数据库中执行以下代码,然后重启数据库服务:

EXEC sp_configure 'user connections',3000
Reconfigure


运行脚本!




当通过连接池连接数据达到2982时,发生错误。加上数据库系统中的18session,连接总数为3000.

 

这个错误网上很常见,连接池虽然可以继续创建新的连接,但是无法与数据库端连接。出现此错误可以判断是数据库端没法连接到。如果不是最大连接数出错,可能是tcp/ip协议未开启、端口未打开或被隔离等。。

 

成功与服务器建立连接,但是在登录前的握手期间发生错误。(providertcp provider error0 –指定的网络名不可再用。)

 

 

接下来在数据库中,删除1000sleepingsession

declare @i int
set @i = 1000
while @i<2000
begin
	exec('kill '+ @i)
	SET @i = @i + 1
end

连接又可以正常进行了。






结果:

  连接池连接数  

  DB连接数  

峰值错误信息

    连接峰值      

40000

0(32767)

当前命令发生了严重错误,应放弃任何可能产生的结果。

32717

3000

0(32767)

超时时间已到,但是尚未从池中获取连接,出现这种情况可能是因为所有池连接均在使用,并达到最大池大小。

3000+系统

40000

3000

成功与服务器建立连接,但是在登录前的握手期间发生错误。

(provider:tcp provider error:0 – 指定的网络名不可再用。)

3000




参考:

http://www.cnblogs.com/lyhabc/articles/2797351.html

http://www.cnblogs.com/lyhabc/archive/2012/12/01/2797559.html

http://www.cnblogs.com/wlb/archive/2012/04/08/2437617.html

http://www.tuicool.com/articles/2y2EJb

http://www.uml.org.cn/net/201002053.asp

http://msdn.microsoft.com/zh-cn/library/8xx3tyca(VS.80).aspx


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值