
2.百度了一下,发现可能是程序的数据库连接字符串出了问题
自己写了个代码测试一下
class Program
{
private static void Main(string[] args)
{
TestSQLServerConnectionCount()
Console.Read()
}
public static void TestSQLServerConnectionCount()
{
try
{
int maxCount = 40000
string connectionString =
"Data Source=localhostInitial Catalog=EveryDayTestUser Id=saPassword=sa123"
for (int i = 1i <maxCounti++)
{
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
max_user_connections 是 MySQL 用户连接数的最大值设置,整段语句的意思是:服务器的 MySQL的最大连接数参数设置不足。解决方法:修改 MySQL 安装目录下 my.ini 或者 my.cnf 文件内的
max_user_connections 参数的数值,重启 MySQL 服务器。
但是正常来说,MySQL默认的100个连接数是足够的。我们需要从程序上去考虑。MySQL的默认最大连接数为100(N),实际给普通
用户使用只有N-1个,保留一个连接是留给超级管理员使用的,防止连接占满了不会把管理员也踢出来。很多网站在运行的时候都会出现连接数受限现象,我认为
十之八九并非是网站的真实访问量太大导致连接数超标,更多是因为我们在设计网站程序的时候采用了不合理的设计架构或数据结构引起的。非正常连接超限可能原
因如下(天缘即时归纳未必完整或无错讹仅供参考):
类似人数、在线时间、浏览数等统计功能与主程序数据库同属一个数据空间时就很容易出现。
复杂的动态页尤其是用户每次浏览都涉及到多数据库或多表 *** 作时候也很容易出现。
还有就是程序设计的不合理(比如复杂运算、等待等 *** 作放置在数据库交互行为中间进行),或者程序存在释放BUG。
计算机硬件配置太低却安装太高版、太高配置的MySQL。
未采用缓存技术。
数据库未经过优化或表格设计及其复杂。
等等一些原因,都会延长数据库的数据交互时间或增加交互次数。所以,如果大家遇到这类问题,首先要考虑程序是否存在BUG导致连接释放失败,
再次就是考虑优化软硬件。当然修改MySQL连接数也是软件优化的 *** 作方法之一,希望大家都能够本着学习的态度通过研究一下自身的原因从而解决这一问题。
如果实在是找不到原因,那就只好先修改连接数,暂缓定位真实原因了。
第一先限制Innodb的并发处理.如果innodb_thread_concurrency = 0 可以先改成 16或是64 看机器压力,如果非常大,先改成16让机器的压力下来,然后慢慢增达,适应自已的业务.
处理方法: set global innodb_thread_concurrency=16
第二: 对于连接数已经超过600或是更多的情况,可以考虑适当的限制一下连接数,让前端报一下错,也别让DB挂了.
DB在了,总是可以用来加载一下数据,当数据加载到了nosql里了,慢慢的DB压力也会降下来的.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)