在 MySQL 8.0.17 中,当出现“Too many connections”错误时,通常意味着数据库连接数已达上限。这不仅会影响应用性能,还可能导致连接池(如 Druid)无法获取新连接。以下是一个清晰简洁的排查与优化指南,帮助你快速解决问题。
MySQL 返回错误码 1040,状态码 08004,提示“Too many connections”。Druid 连接池无法获取连接。
java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
登录 MySQL
-- 当前允许的最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 当前已打开的连接数
SHOW STATUS LIKE 'Threads_connected';
-- 历史峰值
SHOW STATUS LIKE 'Max_used_connections';
查看当前连接明细
SHOW PROCESSLIST;
临时提高连接上限
SET GLOBAL max_connections = 300; -- 根据内存评估
修改配置文件(my.cnf / my.ini)
[mysqld]
max_connections = 300 # 建议 300~500 起步
wait_timeout = 300 # 5 分钟后回收空闲连接
interactive_timeout = 300
重启 MySQL 使配置生效,或使用:
SET PERSIST max_connections = 300;
启用自适应参数(单机专用服务器推荐)
[mysqld]
innodb_dedicated_server = ON
检查连接池配置
spring.datasource.druid.max-active=50
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-wait=3000
spring.datasource.druid.remove-abandoned=true
spring.datasource.druid.remove-abandoned-timeout=60
spring.datasource.druid.log-abandoned-connections=true
确保资源正确关闭
在代码中确保 Connection
、Statement
和 ResultSet
在 finally
块中关闭,防止连接泄露。
引入连接代理
读写分离
关闭死锁检测(极端写场景)
SET GLOBAL innodb_deadlock_detect = OFF;
mysql -uroot -p'密码' -e "
SELECT @@max_connections AS max_conn,
VARIABLE_VALUE AS threads_conn
FROM performance_schema.global_status
WHERE VARIABLE_NAME='Threads_connected';
"
发现 1040 → 查看 max_connections / Threads_connected → 临时 SET GLOBAL → 配置 my.cnf → 重启 → 检查应用池设置 → 检查业务逻辑 → 长期监控
通过以上步骤,你可以快速定位并解决 MySQL 8.0.17 的“Too many connections”问题。关键步骤包括快速确认问题、临时提高连接上限、持久化配置、检查应用和业务逻辑,以及优化高并发场景。希望这份指南能帮助你高效解决问题。