Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
遇到 MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
错误时,意味着你的 MySQL 数据库的最大连接数被达到了,无法建立新的连接。这个问题通常是由于数据库连接池配置不当或者数据库的最大连接数限制过低导致的。
解决方案:
1. 检查 MySQL 的最大连接数设置
首先,检查数据库的最大连接数限制,使用以下命令查看当前的最大连接数:
SHOW VARIABLES LIKE 'max_connections';
这会显示 MySQL 当前的最大连接数。假设返回的值为 151
,你可以根据需要增加此限制。
2. 增加最大连接数
如果你认为连接数限制过低,可以调整 MySQL 的 max_connections
参数。你可以通过以下 SQL 命令临时增加最大连接数:
SET GLOBAL max_connections = 500;
不过这个更改是临时的,MySQL 重启后会失效。为了持久化修改,你需要编辑 MySQL 的配置文件 my.cnf
(或 my.ini
,取决于操作系统)并调整 max_connections
:
[mysqld]
max_connections = 500
然后重启 MySQL 服务来使设置生效:
sudo service mysql restart
3. 检查数据库连接池的配置
如果数据库连接池配置不当,可能会导致数据库连接数量过多,从而触发这个错误。请检查 Spring Boot 中连接池的配置,确保它不会在短时间内创建过多的连接。
在 application.properties
或 application.yml
中配置数据库连接池(例如 HikariCP,Spring Boot 默认使用 HikariCP 作为连接池):
使用 application.properties
:
# 设置最大连接数
spring.datasource.hikari.maximum-pool-size=20
# 设置最小连接数
spring.datasource.hikari.minimum-idle=5
# 设置连接池最大等待时间(毫秒)
spring.datasource.hikari.max-lifetime=60000
# 设置连接最大空闲时间
spring.datasource.hikari.idle-timeout=30000
# 设置连接超时时间
spring.datasource.hikari.connection-timeout=30000
使用 application.yml
:
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
max-lifetime: 60000
idle-timeout: 30000
connection-timeout: 30000
这些配置项可以帮助你控制连接池中的连接数量,防止连接池耗尽数据库的最大连接数。
4. 数据库连接泄漏
如果应用程序在使用数据库连接时没有及时关闭连接,可能导致连接泄漏,从而导致连接数过多。检查代码中数据库连接的使用,确保在数据库操作完成后及时释放连接。
使用 try-with-resources
或手动关闭 Connection
、PreparedStatement
和 ResultSet
来避免连接泄漏:
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM your_table");
ResultSet rs = ps.executeQuery()) {
// 执行数据库操作
} catch (SQLException e) {
// 异常处理
}
5. 数据库负载和性能优化
如果数据库的连接数持续增加,并且 MySQL 性能有问题,可能需要优化查询和数据库操作。例如,优化 SQL 查询,确保没有长时间运行的查询阻塞连接池中的连接,或者考虑拆分数据库负载。
6. 查看和优化应用程序日志
检查应用程序日志,看看是否有连接池的连接被异常占用或者未关闭的情况。如果有,及时修复代码中的连接管理问题。
总结:
- 检查和增加 MySQL 的
max_connections
参数。 - 调整 Spring Boot 中数据库连接池的配置(如 HikariCP)。
- 确保数据库连接在使用后及时释放,避免连接泄漏。
- 如果连接数过多,检查是否存在性能瓶颈或数据库查询优化问题。