Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 7780|回复: 0

解决mysql 1040错误Too many connections的方法

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-8 17:28:38 | 显示全部楼层 |阅读模式

    从官方文档知道linux上面编译安装的mysql默认的连接为100个,这样对于网站的需求来说是远远不够的。 
    mysql官方告诉我们需要修改max_connections的值,那么我们怎么去修改呢?有两种方法 

    1、修改配置文件文件 

    修改/etc/my.cnf这个文件,在[mysqld]中新增max_connections=N,如果你没有这个文件请从编译源码中的support-files文件夹中复制你所需要的*.cnf文件为到/etc/my.cnf。我使用的是my-medium.cnf,中型服务器配置。例如我的[mysqld]的内容如下 

    复制代码代码如下:

    [mysqld] 
    port = 3306 
    socket = /tmp/mysql.sock 
    skip-locking 
    key_buffer = 160M 
    max_allowed_packet = 1M 
    table_cache = 64 
    sort_buffer_size = 512K 
    net_buffer_length = 8K 
    read_buffer_size = 256K 
    read_rnd_buffer_size = 512K 
    myisam_sort_buffer_size = 8M 
    max_connections=1000 


    由于对mysql还不是很熟悉,所以很多参数没有修改。哈哈。。 

    2、非使用mysqld脚本自动启动的用户。 

    修改$MYSQL_HOME/bin/mysqld_safe文件 
    例如:/usr/local/mysql/bin/mysqld_safe这个文件 
    grep -n 'max_connection' $MYSQL_HOME/bin/mysqld_safe 
    修改对应行号的max_connections参数值 
    以上方法为参考网上的做法写的。 

    方法二: 

    在PHP手册里面找关于mysql_connect和mysql_pconnect的资料,下面是在php手册中对这两个函数的描述: 
    mysql_connect 函数原型: 
    resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]]) 
    返回: 
    如果成功则返回一个MySQL 连接标识,失败则返回FALSE。 
    描述: 
    mysql_connect() 建立一个到MySQL 服务器的连接。当没有提供可选参数时使用以下默认值:server = 'localhost:3306',username = 
    服务器进程所有者的用户名,password = 空密码。 
    如果用同样的参数第二次调用mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。参数new_link 改变此行为并使 
    mysql_connect() 总是打开新的连接,甚至当mysql_connect() 曾在前面被用同样的参数调用过。参数client_flags 可以是以下常量的组合 
    :MYSQL_CLIENT_COMPRESS,MYSQL_CLIENT_IGNORE_SPACE 或者MYSQL_CLIENT_INTERACTIVE。 
    注: new_link 参数自PHP 4.2.0 起可用。 
    client_flags 参数自PHP 4.3.0 起可用。 
    一旦脚本结束,到服务器的连接就会被关闭。除非之前已经调用了mysql_close() 来关闭它。 
    mysql_pconnect : 
    函数原型: 
    resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]]) 
    返回: 
    如果成功则返回一个正的MySQL 持久连接标识符,出错则返回FALSE。 
    描述: 
    mysql_pconnect() 建立一个到MySQL 服务器的连接。如果没有提供可选参数,则使用如下默认值:server = 'localhost:3306', 
    username = 服务器进程所有者的用户名,password = 空密码。client_flags 参数可以是以下常量的组合:MYSQL_CLIENT_COMPRESS, 
    MYSQL_CLIENT_IGNORE_SPACE 或者MYSQL_CLIENT_INTERACTIVE。 
    server 参数也可以包括端口号,例如"hostname:port",或者是本机套接字的的路径,例如":/path/to/socket"。 
    注: 对":port" 的支持是3.0B4 版添加的。 
    对":/path/to/socket" 的支持是3.0.10 版添加的。 两者之间的区别 : 
    mysql_pconnect() 和mysql_connect() 非常相似,但有两个主要区别。 
    首先,当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。 
    其次,当脚本执行完毕后到SQL 服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close() 不会关闭由mysql_pconnect() 建立的连接)。 
    可选参数client_flags 自PHP 4.3.0 版起可用。此种连接称为"持久的"。 

    小结一下,要保证你的系统不会出现Too many connections 错误,需要注意两点: 
    1.保证你的apache的最大进程数不超过mysql的最大连接数; 
    2.不要在程序里面用过多mysql_pconnect连接到同一个数据库服务器(一个就够了).这需要好的编码习惯和规范.特别是不断的给系统增加 
    新的功能,如果不注重系统架构和编码规范,当系统的复杂度到了一定的程度,整个系统就变得无法维护了.出现问题的时候解决起来就很麻烦了. 
    解决方法是修改/etc/mysql/my.cnf,添加以下一行: 
    set-variable = max_connections=500 
    或在启动命令中加上参数max_connections=500 
    就是修改最大连接数,然后重启mysql.默认的连接数是100,太少了,所以容易出现如题错误 

    以上摘自 宋利兴的专栏 以下为补充:

    1.可能是mysql的max connections设置的问题
    2.可能是多次insert,update操作没有关闭session,需要在spring里配置transaction支持。

    解决:
    1.修改tomcat里的session 的time-out时间减少为20,(不是必改项)
    2.对处理量大的对数据库insert或update的操作提供transaction支持.

    =======================================
    下面的是解决办法:
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"

    原因:

    因为你的mysql安装目录下的my.ini中设定的并发连接数太少或者系统繁忙导致连接数被占满


    解决方式:

    打开MYSQL安装目录打开MY.INI找到max_connections(在大约第93行)默认是100 一般设置到500~1000比较合适,重启mysql,这样1040错误就解决啦。
    max_connections=1000

    一定要重新启动MYSQL才能生效

    CMD->

    net stop mysql

    net start mysql

    关于改变innodb_log_file_size后无法启动mysql的问题

    innodb_buffer_pool_size=768M
    innodb_log_file_size=256M
    innodb_log_buffer_size=8M
    innodb_additional_mem_pool_size=4M
    innodb_flush_log_at_trx_commit=0
    innodb_thread_concurrency=20
    以上是对innodb引擎的初步优化, 发现是更新innodb_log_file_size=256M时候出现了问题,只要加上这个就无法启动,

    后来才知道原来要STOP服务先,然后再删除原来的文件………
    打开/MySQL Server 5.5/data

    删除ib_logfile0, ib_logfile1........ib_logfilen
    再开启选项,成功启动。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 12:53 , Processed in 0.060720 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表