既然数据库和应用都部署在同一台服务器上,使用 localhost 作为连接地址在逻辑上是完全正确的。

但是,结合你之前遇到的 hikariCP - Connection is not available, request timed out after 30000ms 报错,问题通常出在环境差异配置细节上。请按照以下 4 个步骤逐一排查:

1. 确认 MySQL 服务是否真的在运行(最常见原因)

打包部署到服务器后,MySQL 不会像本地 IDEA 那样自动启动。你需要登录到服务器(47.97.59.142)上检查:

  • Linux 系统:在终端执行 systemctl status mysqlservice mysql status。如果没有运行,请执行 systemctl start mysql 启动它。
  • Windows 系统:打开“服务”(services.msc),找到 MySQL80(或类似名称),确保状态是“正在运行”。

2. 检查数据库名称是否完全匹配

你提供的 URL 中,数据库名是 newbee_mall_db

  • 请确认你在服务器上创建的数据库名字一字不差地叫 newbee_mall_db
  • 如果服务器上叫 newbee_mall 而没有 _db 后缀,连接就会失败。

3. 检查时区配置(推荐优化)

虽然你配置了 serverTimezone=Asia/Shanghai,但在某些 Linux 服务器环境下,JDBC 驱动可能无法正确解析这个时区字符串,导致连接挂起超时。
建议修改:将 serverTimezone=Asia/Shanghai 替换为 serverTimezone=GMT%2B8

修改后的完整 URL 建议如下:

spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=true

(注:这里加上了 allowPublicKeyRetrieval=true,可以防止之前遇到过的 MySQL 8 认证问题)

4. 检查 MySQL 用户权限(Host 限制)

即使数据库在本地,如果你的 MySQL 用户只允许 localhost 访问,而 Java 应用是通过 IPv6 或其他回环地址连接的,也可能被拒绝。
登录服务器的 MySQL,执行以下命令检查并授权:

-- 查看 root 用户的 host 权限
SELECT host, user FROM mysql.user WHERE user = 'root';

-- 如果只有 localhost,建议授权允许所有 IP(包括 127.0.0.1)
CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

💡 快速定位建议:

先登录服务器执行 telnet localhost 3306

  • 如果提示 Connected,说明数据库正常,问题出在配置(账号密码/数据库名/时区)
  • 如果提示 Connection refused,说明数据库根本没启动或者端口不对
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐