Data source rejected establishment of connection, message from server: “Too many connections“

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.propertiesapplication.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 或手动关闭 ConnectionPreparedStatementResultSet 来避免连接泄漏:

try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM your_table");
     ResultSet rs = ps.executeQuery()) {
    // 执行数据库操作
} catch (SQLException e) {
    // 异常处理
}
5. 数据库负载和性能优化

如果数据库的连接数持续增加,并且 MySQL 性能有问题,可能需要优化查询和数据库操作。例如,优化 SQL 查询,确保没有长时间运行的查询阻塞连接池中的连接,或者考虑拆分数据库负载。

6. 查看和优化应用程序日志

检查应用程序日志,看看是否有连接池的连接被异常占用或者未关闭的情况。如果有,及时修复代码中的连接管理问题。

总结:

  1. 检查和增加 MySQL 的 max_connections 参数。
  2. 调整 Spring Boot 中数据库连接池的配置(如 HikariCP)。
  3. 确保数据库连接在使用后及时释放,避免连接泄漏。
  4. 如果连接数过多,检查是否存在性能瓶颈或数据库查询优化问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值