当前位置: 代码迷 >> C# >> 数据库访问超过最大连接数有关问题
  详细解决方案

数据库访问超过最大连接数有关问题

热度:438   发布时间:2016-04-28 08:41:25.0
数据库访问超过最大连接数问题?
例如:有1个数据库服务器,最大连接数允许300。但是我有1000个c/s结构的客户端采用连接池访问此数据库,如果连接池里面设置最小连接数是1,那么不是已经达到最大连接数300了吗?还有700个客户端怎么办?

请问采用什么样的架构解决此问题? 
------解决思路----------------------
恕我直言,都没有说到点子上去,没有解释楼主最根本的问题

第一,有1个数据库服务器,最大连接数允许300。我不明白为什么你的数据库最大连接数是300,
可以通过select @@MAX_CONNECTIONS查看最大连接数,即便如此,也罢,往下看
第二,即便是最大连接数是300,你有1000个客户端,客户端启用了连接池,也没有关系,连接池是一种客户端机制,如果服务器端强制断开,那客户端缓存的连接也没用,我的意思就是,即便是客户端开启了连接池,客户端的连接池也不会“绑架”数据库连接,对于数据库的连接,是数据库服务器说了算的,不会因为客户端启用了连接池,同时不释放连接,服务器就无法工作了。

举个极端的例子,数据库服务器,最大连接数允许300,一个客户启用连接池之后,端缓存了300个连接,那岂不是所有的其他的客户端都无法访问数据库了,等于是数据库被这一个客户端“绑架”了。可能吗?

要知道服务器是主动的,客户端是被动的,服务器需要新建连接的时候,如果发现连接资源没有了,将会去释放其他客户端缓存的连接池中建立的连接的。

客户端启用连接池之后,使用连接池中的数据库连接的时候不是没有任何校验措施的,最起码,使用之前,要看看这个连接是否有效,是否被服务器强制断开(踢掉)等等。

另外一个问题,我觉得楼主还没弄清楚,就是并发的,你并发访问数据库,也就是多个客户端访问之后立马断开,比如你最大连接数是300,如果有1000个人同时(我是说同时,是同一个时间点,同一分钟同一秒同一毫秒同一微妙,你明白这个同时的含义吧)去点击一个按钮,访问数据库,那么,此时数据库会先对一部分连接进行数据库操作,待先拿到数据库连接资源的会话操作完成之后,其他的会话才能建立连接,此时也并不是说其他客户端无法访问数据库,而是说要等待,至于等待多久,要看你连接一次数据库经过多久再去释放这个连接,并不是说你有超过了数据库最大连接的用户数,这些用户就无法访问数据库了,除非(我是说除非)你这1000个客户端同一时刻去访问数据库,会出现因为数据库连接资源不足而等待(获取数据库连接资源)延迟(也就是延迟,还不是不可访问),否则,根本就不会出现你说的什么并发问题。




------解决思路----------------------
同时也还是操作完毕就及时释放物理连接  -->   同时也还是操作完毕就及时释放逻辑连接

如果你的应用首先使用20毫秒访问(查询)了一下数据库记录,然后过了200毫秒又依次访问数据库,那么你第一次访问数据库之后就应该立刻调用 close 操作来关闭逻辑连接。这样物理连接就能自动共享给其它客户端的请求。这就是为什么1000个c/s客户端使用数据库,往往在连接池中只要有不到30个物理连接就够用的道理。

如果你自作聪明地使用static变量去“共享”什么逻辑连接,用在前后两个数据库访问中,那就意味着你占用一个“茅坑”的时间长度是220毫秒以上,而不是10毫秒。你可以算算看,这将让“茅坑”的并发使用率降低多少倍?


连接池只有利、没有弊!

如果你的应用程序不去即使释放逻辑连接,所谓“缓存连接”,那么跟数据库连接池毫无关系。又不是人家数据库连接池给你“缓存连接”的,纯粹是你编写的程序的问题。因此连接池没有弊,只有利。
  相关解决方案