MySQL数据库连接数不足是线上系统经常遇到的故障之一,当并发请求超过数据库允许的最大连接时,新的连接会被拒绝并抛出Too many connections错误。要解决这一问题,需要从数据库配置和应用程序两个层面同时入手。

查看当前连接状态
首先应确认数据库当前的最大连接数以及实际连接占用情况,可以使用如下SQL语句:
-- 查看最大连接数配置 SHOW VARIABLES LIKE 'max_connections'; -- 查看当前已使用的连接数 SHOW STATUS LIKE 'Threads_connected'; -- 查看所有连接来源,便于排查异常连接 SELECT user, host, db, command, time FROM information_schema.processlist ORDER BY time DESC;
临时调整最大连接数
如果业务突发流量导致连接耗尽,可先临时调高max_connections以恢复服务:
-- 临时将最大连接数设为500,重启后失效 SET GLOBAL max_connections = 500;
需要注意的是,该方式在MySQL重启后会恢复为配置文件中的值,仅适合应急使用。
永久修改配置文件
若确认需要长期支持更高并发,应在配置文件中进行永久调整。以Linux下的my.cnf为例:
[mysqld] # 设置最大连接数为500 max_connections = 500 # 每个连接可使用的线程缓存,降低频繁创建开销 thread_cache_size = 100
修改完成后重启MySQL服务使配置生效。
优化应用程序连接使用
很多连接数不足的问题并非数据库本身限制,而是代码中没有正确关闭连接。以下是Java中使用try-with-resources确保连接释放的示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Demo {
public void query() throws Exception {
// 使用try-with-resources自动关闭连接
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/test", "user", "pass");
PreparedStatement ps = conn.prepareStatement("SELECT id FROM user");
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getInt("id"));
}
}
}
}
引入连接池
使用连接池可以复用物理连接,避免频繁建立和断开。常见连接池如HikariCP应合理设置最大连接数:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");
config.setUsername("user");
config.setPassword("pass");
// 连接池最大连接数应小于数据库max_connections
config.setMaximumPoolSize(50);
HikariDataSource ds = new HikariDataSource(config);
清理空闲与异常连接
对于长时间空闲或卡住的连接,可以手动结束。通过processlist找到Id后执行:
-- 终止指定连接,需替换为实际Id KILL 12345;
同时建议设置wait_timeout和interactive_timeout,让数据库自动回收闲置连接:
SET GLOBAL wait_timeout = 28800; SET GLOBAL interactive_timeout = 28800;
总结处理思路
- 先查现状,确认是否达到max_connections上限
- 应急调高参数,恢复业务访问
- 修改配置文件,做长期容量规划
- 优化代码与连接池,减少不必要的占用
- 设置超时与监控,防止连接泄漏
通过以上方法,基本可以解决大部分MySQL数据库连接数不足的问题,并提升系统的稳定性。
MySQL数据库连接数max_connections修改时间:2026-07-28 10:24:21