sqlserver连接数超过100无法连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver连接数超过100无法连接相关的知识,希望对你有一定的参考价值。

1.首先,看了看SQL Server服务器属性的配置,看到连接数为0,即不限制,SQLserver最大连接数为32767。看来应该不是这里的问题

2.百度了一下,发现可能是程序的数据库连接字符串出了问题

自己写了个代码测试一下

class Program

private static void Main(string[] args)

TestSQLServerConnectionCount();
Console.Read();


public static void TestSQLServerConnectionCount()

try

int maxCount = 40000;
string connectionString =
"Data Source=localhost;Initial Catalog=EveryDayTest;User Id=sa;Password=sa123;";
for (int i = 1; i < maxCount; i++)

var db = new SqlConnection(connectionString);
db.Open();
Console.WriteLine("已创建连接对象" + i);


catch (Exception ex)

Console.WriteLine(ex.Message);



发现最多只能创建100个,

然后添加了属性Max Pool Size=101,又测了一下,恩可以了

。恩果然是这里,不过。在测试系统的时候发现,有的时候连接数到达40多或60多或80多后就不再增长了,难道说这里有个重复利用数据库连接的机制?

找了一下,发现有个Pooling属性,默认为true,于是加上了这条Pooling=false,运行一下

哇擦,已经超过了32767!!!难道说这个属性可以让连接反复利用,从连接池取出来可以再次使用的连接对象?还是说根本不受连接池的最大限制?

果然,看了一下连接池的运行方式发现:

1、当一个程序执行Connection.open()时候,ADO.net就需要判断,此连接是否支持Connection Pool (Pooling 默认为True)

(1)、如果指定为False, ADO.net就与数据库之间创建一个连接,然后返回给程序。

(2)、如果指定为 True,ADO.net就会根据ConnectString创建一个Connection Pool,然后向Connection Pool中填充Connection。填充多少个Connection由Min Pool Size (默认为0)属性来决定。例如如果指定为5,则ADO.net会一次与SQL数据库之间打开5个连接,然后将4个Connection,保存在 Connection Pool中,1个Connection返回给程序。

2、当程序执行到Connection.close() 的时候。如果Pooling 为True,ADO.net 就把当前的Connection放到Connection Pool并且保持与数据库之间的连接。

同时还会判断Connection Lifetime(默认为0)属性,0代表无限大,如果Connection存在的时间超过了Connection LifeTime,ADO.net就会关闭的Connection同时断开与数据库的连接,而不是重新保存到Connection Pool中。

3、当下一次Connection.Open() 执行的时候,ADO.Net就会判断新的ConnectionString与之前保存在Connection Pool中的Connection的connectionString是否一致。

4、 ADO.net需要判断当前的Connection Pool中是否有可以使用的Connection(没有被其他程序所占用),如果没有的话,ADO.net就需要判断ConnectionString设 置的Max Pool Size (默认为100)

(1)、如果Connection Pool中的所有Connection没有达到Max Pool Size,ADO.net则会再次连接数据库,创建一个连接,然后将Connection返回给程序。

(2)、如果已经达到了 MaxPoolSize,ADO.net就不会再次创建任何新的连接,而是等待Connection Pool中被其他程序所占用的Connection释放,这个等待时间受SqlConnection.ConnectionTimeout(默认是15 秒)限制,也就是说如果时间超过了15秒,SqlConnection就会抛出超时错误。

5、如果有可用的Connection,从Connection Pool 取出的Connection也不是直接就返回给程序,ADO.net还需要检查ConnectionString的ConnectionReset属性 (默认为True)是否需要对Connection 最一次reset。

-------------------摘自《http://www.studyofnet.com/news/637.html 数据库最大连接池max pool size》

不过,为什么系统测试时到了60左右的连接数不再增长了?max
参考技术A 最近公司测试在进行服务器性能测试,在处理超过100个并发请求后,数据库就崩掉了。

闲着没事,就找了一下原因。

1.首先,看了看SQL Server服务器属性的配置,看到连接数为0,即不限制,SQLserver最大连接数为32767。看来应该不是这里的问题

2.百度了一下,发现可能是程序的数据库连接字符串出了问题

自己写了个代码测试一下

class Program

private static void Main(string[] args)

TestSQLServerConnectionCount();
Console.Read();


public static void TestSQLServerConnectionCount()

try

int maxCount = 40000;
string connectionString =
"Data Source=localhost;Initial Catalog=EveryDayTest;User Id=sa;Password=sa123;";
for (int i = 1; i < maxCount; i++)

var db = new SqlConnection(connectionString);
db.Open();
Console.WriteLine("已创建连接对象" + i);


catch (Exception ex)

Console.WriteLine(ex.Message);



发现最多只能创建100个,

然后添加了属性Max Pool Size=101,又测了一下,恩可以了

。恩果然是这里,不过。在测试系统的时候发现,有的时候连接数到达40多或60多或80多后就不再增长了,难道说这里有个重复利用数据库连接的机制?

找了一下,发现有个Pooling属性,默认为true,于是加上了这条Pooling=false,运行一下

哇擦,已经超过了32767!!!难道说这个属性可以让连接反复利用,从连接池取出来可以再次使用的连接对象?还是说根本不受连接池的最大限制?

果然,看了一下连接池的运行方式发现:

1、当一个程序执行Connection.open()时候,ADO.net就需要判断,此连接是否支持Connection Pool (Pooling 默认为True)

(1)、如果指定为False, ADO.net就与数据库之间创建一个连接,然后返回给程序。

(2)、如果指定为 True,ADO.net就会根据ConnectString创建一个Connection Pool,然后向Connection Pool中填充Connection。填充多少个Connection由Min Pool Size (默认为0)属性来决定。例如如果指定为5,则ADO.net会一次与SQL数据库之间打开5个连接,然后将4个Connection,保存在 Connection Pool中,1个Connection返回给程序。

2、当程序执行到Connection.close() 的时候。如果Pooling 为True,ADO.net 就把当前的Connection放到Connection Pool并且保持与数据库之间的连接。

同时还会判断Connection Lifetime(默认为0)属性,0代表无限大,如果Connection存在的时间超过了Connection LifeTime,ADO.net就会关闭的Connection同时断开与数据库的连接,而不是重新保存到Connection Pool中。

3、当下一次Connection.Open() 执行的时候,ADO.Net就会判断新的ConnectionString与之前保存在Connection Pool中的Connection的connectionString是否一致。
参考技术B sqlserver连接数超过100无法连接,遇到这种情况的话,就是因为你的这个连接数的话,它超过了100的话是无法连接的,并且的话是不允许这样的发生的,因此的话你一定要不能超过100,不然的话会损坏他的机器。

以上是关于sqlserver连接数超过100无法连接的主要内容,如果未能解决你的问题,请参考以下文章

postgresql性能优化-最大连接数

记一次Oracle session数过多引起进程数超过processes限制最终导致客户端无法连接的问题

如何解决MySQL超过最大连接数问题 max

Mysql中Sleep进程连接数过多问题解决

如何用PHP连接SQL Server

mysql最大连接数默认只有100,当很多用户访问带有数据库的站点如论坛时,会造成mysql服务CPU占用率上升,并无法提供服务