解决Spring Boot 部署到服务器无法连接MySQL 问题

本文记录了在部署Spring Boot项目到Digital Ocean服务器时遇到的无法连接MySQL问题。通过检查application.properties文件、确认数据库配置以及解决MySQL远程访问权限问题,最终成功解决了通信链接失败的错误。建议在允许所有IP访问时注意风险。

今天spring boot 项目终于写好了,打算部署在刚买的digital ocean服务器上,从github pull之后,执行:

mvn clean compile package

报错提示:

com.mysql.cj.jdbc.exceptions.CommunicationsException: 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 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.18.jar:8.0.18]

第一感觉是数据库连接的问题,先把application.properties里关于databse的内容全部comment:

#spring.datasource.url=jdbc:mysql://***:3306/db_test?serverTimezone=GMT%2B8
#spring.datasource.username=root
#spring.datasource.password=password

再执行:

mvn spring-boot:run

项目果然能跑起来了,说明就是数据库连接问题。

这个问题太艰难了,出现问题的可能的点很多,网上找了N多资料,有同样问题的同学可以看一下汇总:

https://stackoverflow.com/questions/6865538/solving-a-communications-link-failure-with-jdbc-and-mysql

这里面第二高赞提到了mysql localhost以外的权限问题

详细步骤参考了digital ocean 官方的解答:  Hot to Allow Remote Access to MySQL

我个人的问题就是是MySQL没有开启允许外部网访问, 因为mysql默认只允许127.0.0.1访问

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
. . .

把这里的bind-address 改成* 或者0.0.0.0,再执行:

sudo ufw allow from 允许访问的IP地址 to any port 3306

如果你想允许所有ip都可以访问,可以

sudo ufw allow 3306

当然这样风险就太高了,不建议。

最后重启MySQL:

sudo systemctl restart mysql

再启动spring boot project, 终于成功运行了。

 

部署问题很难受,debug了一整天。希望大家部署过程顺利~

### Spring Boot 项目部署服务器教程 #### 安装 JDK 为了确保 Spring Boot 应用能够正常运行,在目标服务器上需要先安装 Java Development Kit (JDK),版本需满足项目的最低要求(通常为 JDK 1.8 或更高)。如果服务器已经安装了合适的 JDK,则可以跳过此步骤[^1]。 #### 数据库环境准备 对于大多数 Spring Boot 项目,数据库是一个重要的组成部分。因此,需要在服务器上安装并配置所需的数据库服务(如 MySQL、PostgreSQL 等),或者连接远程数据库实例。同样地,如果数据库已经在服务器上完成配置,则无需重复操作。 #### 打包 Spring Boot 项目 通过 Maven 或 Gradle 构建工具将本地开发好的 Spring Boot 项目打包成可执行的 JAR 文件。以下是基于 Maven 的命令用于生成 JAR 包: ```bash mvn clean package -DskipTests ``` 该命令会清理旧文件、编译源码并生成最终的目标 JAR 文件,存储路径一般位于 `target` 目录下[^3]。 #### 开放防火墙端口 为了让外部设备能访问部署服务器上的应用,必须确认所使用的 HTTP(S) 请求端口未被防火墙封锁。例如,默认情况下 Spring Boot 使用的是 8080 端口;可以通过修改配置文件更改监听端口,并相应调整安全组设置或 iptables 规则来允许特定流量进入。 #### 部署与启动项目 上传构建所得的 JAR 文件至云端主机后,切换到对应目录并通过如下指令启动程序: ```bash nohup java -jar your-spring-boot-app.jar > app.log & ``` 上述脚本中的 `-jar` 参数指定要加载的应用程序档案名称,而 `nohup` 命令使得进程能够在终端关闭之后继续运行。日志输出重定向到了名为 `app.log` 的文档里以便后续排查问题之用。 #### 访问验证 一旦应用程序成功上线,就可以借助浏览器或者其他客户端工具尝试调用 API 接口来进行功能测试。假设服务器 IP 地址为 `xx.xx.xx.xx` 并且保持默认端口号不变的话,那么完整的 URL 形式可能是这样的:http://xx.xx.xx.xx:8080/your-endpoint-path。 #### 停止服务 当维护工作结束或者需要更新新版本的时候,可能需要用到平滑停机机制。一种简单的方法就是找到正在运行的服务 ID 号再发送 SIGTERM 信号给它终止运作过程: ```bash ps aux | grep your-spring-boot-app.jar kill -9 PID ``` 这里替换掉实际查询出来的进程编号作为参数传递进去即可实现强制杀掉关联线程的效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值