Spring Boot应用连接远程MySQL服务器遇连接拒绝问题求助
问题:Spring Boot应用连接远程MySQL数据库提示“连接被拒绝”
错误信息
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) at com.mysql.cj.NativeSession.connect(NativeSession.java:144) at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:850) ... 50 more Caused by: java.net.ConnectException: Connection refused: no further information at java.base/sun.nio.ch.Net.pollConnect(Native Method) at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:549) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:633) at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ... 52 more
情况说明
我能用相同的账号密码通过MySQL Workbench从本地电脑访问该远程数据库,但Spring Boot应用连接时却提示连接被拒绝。
已尝试的解决步骤
- 创建了允许远程访问的数据库用户
remoteUser@% - 给该用户授予所有数据库的全部权限
- 执行了权限刷新操作
- 用
sudo ufw allow 3308命令允许端口3308的入站流量 - 修改
mysqld.cnf文件,注释了绑定地址配置:
#commented both of the following lines # bind-address = 127.0.0.1 # mysqlx-bind-address = 127.0.0.1
- 重启MySQL服务器:
sudo service mysql restart - 更新Spring Boot应用配置文件的连接信息:
spring.datasource.url=jdbc:mysql://server_ip:3308/db_name spring.datasource.username=remoteUser spring.datasource.password=remotePassword
- 重启Spring Boot应用
问题仍未解决,求帮助。
排查方向与解决方案
1. 确认MySQL实际监听的端口
你配置里用了3308,但默认MySQL端口是3306,先查远程服务器上MySQL到底在监听哪个端口:
- 执行命令:
sudo netstat -tulpn | grep mysql - 如果输出显示监听3306,把Spring Boot配置里的端口改成3306再试
2. 检查服务器防火墙规则优先级
虽然加了允许3308的规则,但可能之前的拒绝规则优先级更高,查看完整UFW规则:
- 执行:
sudo ufw status numbered - 如果3308的允许规则排在后面,调整顺序:
sudo ufw insert 1 allow 3308,然后重启UFW:sudo ufw reload
3. 验证Spring Boot所在机器的网络连通性
如果Spring Boot不是在你本地电脑运行(比如部署在其他服务器/容器),得确认这台机器能连到远程MySQL:
- 测试端口连通:
telnet server_ip 3308 - 如果telnet失败,说明中间有防火墙(比如云服务商的安全组、内网防火墙)挡了,得开放对应端口
4. 确认MySQL用户权限是否真的生效
手动验证用户权限:
- 用Workbench登录后执行:
SELECT user, host FROM mysql.user WHERE user='remoteUser';,确保host是% - 再执行:
SHOW GRANTS FOR 'remoteUser'@'%';,确认权限包含ALL PRIVILEGES ON *.*
5. 检查MySQL配置是否生效
修改配置后重启了服务,但再确认绑定地址:
- 执行:
mysql -e "SHOW VARIABLES LIKE 'bind_address';" - 如果输出还是
127.0.0.1,说明你改的配置文件不对,有些系统的MySQL配置在/etc/mysql/my.cnf或者/etc/mysql/mysql.conf.d下的其他文件里,找到正确的配置文件修改后再重启服务
6. 修正Spring Boot配置细节
- 去掉配置项前面的空格,比如
spring.datasource.url改成spring.datasource.url,确保配置格式正确 - 确认
server_ip是远程服务器的公网IP或者Spring Boot能访问的内网IP,别用localhost/127.0.0.1 - 可以给URL加额外参数避免连接问题:
spring.datasource.url=jdbc:mysql://server_ip:3308/db_name?useSSL=false&serverTimezone=UTC spring.datasource.username=remoteUser spring.datasource.password=remotePassword
内容的提问来源于stack exchange,提问作者Sayed Hussainullah Sadat
相关产品推荐
相关产品推荐

