当MySQL数据库出现Too many connections报错时,说明当前数据库的活跃连接数已经达到了配置的最大连接数上限,新的连接请求无法被处理,会直接影响业务的正常访问。这个报错在业务流量突增或者连接池配置不合理时经常出现。

报错原因分析
出现Too many connections报错的核心原因是数据库连接数超过了max_connections参数的设定值,常见的触发场景有以下几种:
- 业务流量突增,短时间内大量请求创建数据库连接,超过了当前最大连接数限制
- 数据库连接没有正确释放,比如代码中忘记关闭连接,或者连接池配置的最小连接数过高,空闲连接长期占用资源
max_connections参数配置过低,无法满足业务正常的并发连接需求- 数据库存在慢查询,连接长时间被占用无法释放,导致可用连接数快速耗尽
临时解决办法
如果是线上业务突发这个报错,需要先做临时处理恢复服务,再排查根本原因。
1. 查看当前连接状态
先登录MySQL数据库,查看当前的连接数和最大连接数配置:
-- 查看当前最大连接数配置 SHOW VARIABLES LIKE 'max_connections'; -- 查看当前已经使用的连接数 SHOW STATUS LIKE 'Threads_connected'; -- 查看所有活跃连接,找到占用连接的线程 SHOW PROCESSLIST;
2. 临时调大最大连接数
如果确认是最大连接数配置不足,可以临时调整参数,不需要重启数据库:
-- 临时将最大连接数调整为500,重启后会恢复为配置文件的值 SET GLOBAL max_connections = 500;
3. 终止无用连接
如果发现有长时间空闲或者执行异常的线程,可以手动终止对应的连接:
-- 终止线程ID为123的连接,线程ID可以从SHOW PROCESSLIST的结果中获取 KILL 123;
长期解决办法
临时处理只能解决当前问题,还需要从配置和代码层面做优化,避免问题反复出现。
1. 调整MySQL配置文件
修改MySQL的配置文件my.cnf(Linux系统)或者my.ini(Windows系统),设置合理的最大连接数,然后重启数据库让配置永久生效:
[mysqld] # 根据业务实际需求调整,一般建议设置为300-1000之间,不要设置过高避免内存溢出 max_connections = 500 # 设置每个连接的最大空闲时间,超过该时间的空闲连接会被自动关闭 wait_timeout = 300 interactive_timeout = 300
2. 优化连接池配置
如果是应用侧使用连接池,需要合理配置连接池参数,避免创建过多连接:
// 以HikariCP连接池为例,合理配置参数
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test_db");
config.setUsername("root");
config.setPassword("123456");
// 连接池最大连接数,不要超过MySQL的max_connections配置
config.setMaximumPoolSize(100);
// 最小空闲连接数,避免频繁创建连接
config.setMinimumIdle(10);
// 连接最大存活时间,超过会被回收
config.setMaxLifetime(300000);
// 连接超时时间
config.setConnectionTimeout(30000);
3. 优化数据库查询和代码逻辑
避免出现慢查询,减少单个连接的占用时间,同时在代码中确保数据库连接在使用后正确关闭:
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
ps = conn.prepareStatement("SELECT * FROM user WHERE id = ?");
ps.setInt(1, 1);
rs = ps.executeQuery();
// 处理结果集
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 逆序关闭资源,避免资源泄漏
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注意事项
调整max_connections参数时需要注意,每个连接都会占用一定的内存资源,如果设置过高可能会导致MySQL服务器内存不足,反而影响数据库稳定性。建议根据服务器的内存配置和业务的实际并发需求合理设置该参数,同时配合连接池和连接超时配置,从多个层面避免Too many connections报错的出现。
MySQLToo_many_connections数据库连接池max_connections修改时间:2026-06-15 11:54:30