mysql 出現too many connections后,大家都是怎麼解決的呢?

mysql的connection是一個有限的資源,每個connection一個線程,所以不能開太多。 如果出現too many connections 後,大家都有什麼好的方法解決呢?

评论 (0)链接2011-09-14 

max_connections可以开大点,但还是有限的,不能无限大。硬伤。
首先可以查查那些慢SQL操作,优化代码,很多情况下是由于SQL查询慢,不能及时释放连接。
一般我们会增加连接池,分库分表设计。尽可能地减少单次SQL操作的时间。
脚本执行完毕的时候,手动关闭连接,尽快释放连接资源。

小飞
小飞
6832
编辑于 2011-09-14
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (4)链接 • 2011-09-14
  • 1 支持
    優化sql的執行效率是很重要的一個方面, 另外mysql的connect過程非常慢,效率不高,如果通過mysql proxy做一層代理,可以實現一個連接池,比直接連mysql效率高很多,而且不需要使用php裏面雞肋的pconnect。 – 项根生 2011-09-16
  • 0 支持
    mysql proxy是个好办法,而且可以配置读写分离,不过据说在32位操作系统下不大稳定。有人用过吗? – 程序员1999 2011-09-16
  • 0 支持
    還好,我們一直在用。 – 项根生 2011-09-20
  • 0 支持
    我遇到过一个问题,在使用c3p0 数据库连接池的时候,由于配置的c3p0的bonecp.minConnectionsPerPartition,bonecp.maxConnectionsPerPartition,bonecp.partitionCount不合理导致数据库连接无法释放的情况,所以最好方式是手动关闭 – Craig 2012-11-07

以 Linux + Nginx + PHP + MySQL 为例

一般我会从下面几个思路来寻找解决方法

a. 是否 WEB 的连接数就很大

  
那么可以考虑用 Varnish(或Squid) 来 Cache 一些动态的请求
通过这个步骤来减少这些动态请求对 MySQL 的请求

b. 机器负载是否很高

  
可以考虑,哪些是静态数据,哪些是不活跃数据,哪些是活跃数据
如果静态数据较小,那么可以试试静态数据直接保存成 PHP 文件
如果较大,可以放在 TTServer 中去
活跃数据的话,可以保存在 Memcache 中,如果需要持久化,也可
以保存在 TTServer 等 NoSQL 中去

c. 是不是有不合格的 SQL 语句在运行

  
那么可以用 mysqldumpslow 分析 mysql 的slow query log

d. PHP 里的 mysql.pconnect 可能不太好使

  
那是很久前我用 mysql.pconnect ,容易出现 MySQL 宕机的情况,改为
mysql.connect 后情况好转,其他语言,或现在的 PHP 未必有这个
情况

e. 申请新机器 :)

刘毅
编辑于 2011-09-15
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-09-15
  1. 加大最大连接数,减少wait_timeout时间,这个需要实际应用中多尝试
  2. 用mysql_pconnect()代替mysql_connect(),减少连接和断开次数
  3. 检查耗时的读写sql,针对性的分库分表,读写分离,减少瓶颈库表的压力
  4. 复杂的sql语句建议用存储过程代替
  5. 补充一下,上面好多兄弟对mysql_pconnect提出了疑问,我建议的初衷是如果频繁与数据库建立连接与断开接连,这种开销会很大,可能会造成大量连接出现CLOSE_TIMEOUT情况出现,导致连接被占用,而mysql_pconnect设计的目的是为了提供一种机制来减少与Mysql服务器建立/断开连接的开销,如果这种方案应用得当可以解决这类问题。当然了,如果mysql持久链接应用不当,比如持久链接使用表锁时,异常情况下会锁表造成其它用户被阻塞,所以这些都得视情况而定,灵活应用,不能一棍子打死
马瑜
编辑于 2011-09-15
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2011-09-14
  • 0 支持
    CLOSE_TIMEOUT 是由于半关闭照成的,即一端不知道另一端已经关闭了,TCP协议的原因。
    个人觉得mysql_pconnect优于mysql_connect的原因就是mysql重用了已经关闭的socket,提高连接关闭吞吐量。
    – 黄文彬 2011-10-17

出现too many connections除了访问量激增的情况下,多半是因为某些SQL引起了拥堵所致,注意根据满查询日志来调优,另外mysql持久链接是鸡肋,多数情况下无济于事,只会节外生枝。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-09-15

尽量采用中间件+异步的方式操作数据库,这样可以避免资源方面的限制。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (3)链接 • 2011-09-14
  • 0 支持
    对于你来说,实际中用得多的有哪些?具体补充下。 – Geo5 2011-09-14
  • 0 支持
    中间件具体指什么? – 黄文彬 2011-10-17
  • 0 支持
    @黄文彬,应该是指连接池之类 – 至尊宝 2011-10-19

php环境中得mysql持久链接没有意义只会造成 too many connections,所以请关闭mysql持久链接。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2011-09-15
  • 0 支持
    很有道理,反对用pconnect() – 程序员1999 2011-09-15

一般这种情况的出现有两种情况
1.业务激增,这个需要根据实际情况分析来进行优化
2.有慢操作阻塞

建议对是否有慢操作进行检查、优化
如果未达到预期目的,再进行加大connection、换机器之类的工作

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2011-10-19

可以使用mysql_pconnect(),同时对于数据库连接部分使用设计模式中的--单态模式,这样可以减少很多连接数,并且速度上也有提升。。。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-07-28
  • 0 支持
    如果使用php的话,即使你使用单态模式的代码,也起不到单态模式的功能。php的单态模式仅仅在当次请求时起作用,请求完成后,就会被销毁。 – yunnysunny 2012-08-04

增加链接池,再根据实际情况调整参数

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-07-31
  • 0 支持
    你说的j2ee中的连接池吧。 – yunnysunny 2012-08-04
德问是一个专业的编程问答社区,请 登录注册 后再提交答案