碰见Could not open JDBC Connection for transaction问题解决
1. 先定位连接失败的具体原因
"Could not open JDBC Connection" 通常是一个上层错误,其底层会包含更具体的嵌套异常(如连接超时、密码错误、数据库未启动等)。必须找到嵌套的根异常才能精准解决,可通过以下方式获取:
查看应用日志中该错误前后的详细输出,寻找类似
java
Caused by: xxx 的嵌套异常(例如:
Caused by: java.sql.SQLException: Access denied for user 'xxx'@'xxx'(密码错误 / 权限不足)
Caused by: java.net.ConnectException: Connection refused(数据库未启动 / 端口错误)
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure(网络中断)
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms(连接池耗尽)
若服务已无法正常提供,可先执行以下操作临时恢复:
1、重启 MySQL 服务
重启会强制关闭所有现有连接,释放连接数(生产环境谨慎操作,可能影响正在执行的事务)。
java
Linux:systemctl restart mysqld 或 service mysql restart
Windows:在服务管理器中重启 "MySQL" 服务
2、手动杀死空闲连接
登录 MySQL 客户端,执行以下命令查看并终止长时间空闲的连接:
sql
sql
-- 查看所有连接(关注 Id、Time、State 列)
show processlist;
-- 终止指定空闲连接(替换 123 为实际连接ID)
kill 123;
二、根本解决方案(长期有效)
1.、调整 MySQL 的最大连接数限制
MySQL 默认最大连接数为 151,若应用需求超过此值,需调大该参数:
临时生效(重启后失效):
sql
登录 MySQL 客户端执行:
sql
-- 设置最大连接数为1000(根据服务器性能调整)
set global max_connections = 1000;
-- 查看当前设置
show variables like 'max_connections';
2、永久生效(推荐):
修改 MySQL 配置文件(my.cnf 或 my.ini),添加 / 修改以下配置:
sql
ini
[mysqld]
max_connections = 1000 # 最大连接数
wait_timeout = 600 # 连接空闲超时时间(秒,默认8小时,建议缩短至10分钟)
interactive_timeout = 600 # 交互连接超时时间(与wait_timeout保持一致)
修改后重启 MySQL 服务使配置生效。