You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot无法连接Ubuntu虚拟机MySQL数据库问题求助

问题描述

MySQL服务器部署在IP为10.0.0.200的Ubuntu虚拟机上,SSH端口为3333。启动Spring Boot应用时出现以下错误:

java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

当前application.properties配置:

spring.datasource.url = jdbc:mysql://10.0.0.200:3306/test?useSSL=false&allowPublicKeyRetrieval=true&autoReconnect=true
spring.datasource.username = boss
spring.datasource.password = StrongPass123!
spring.jpa.show-sql= true
spring.jpa.hibernate.ddl-auto= update
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5Dialect

尝试过的操作:

  • 错误地在JDBC URL中嵌套SSH端口:
spring.datasource.url = jdbc:mysql://{10.0.0.200:3333}:3306/test?useSSL=false&allowPublicKeyRetrieval=true&autoReconnect=true
  • 在my.cnf中将MySQL绑定地址设置为虚拟机IP/localhost,但无效。
  • 确认数据库凭据正确,但Spring Boot仍无法启动。

完整错误堆栈:

java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:898) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:823) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-java-8.0.29.jar:8.0.29]  
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.29.jar:8.0.29]
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na]   
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar:na]
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar:na]        
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) 
~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:175) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) 
~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:173) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.6.9.Final.jar:5.6.9.Final]
解决方案

1. 修正JDBC URL的错误用法

SSH端口(3333)和MySQL端口(3306)是独立服务端口,JDBC URL仅需指定MySQL的IP和3306端口,无需嵌套SSH端口。恢复最初的URL配置即可:

spring.datasource.url = jdbc:mysql://10.0.0.200:3306/test?useSSL=false&allowPublicKeyRetrieval=true&autoReconnect=true

2. 配置MySQL允许远程连接

步骤1:修改MySQL绑定地址

编辑my.cnf或mysqld.cnf,路径通常为/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address项,设置为0.0.0.0(允许所有IP访问)或Spring Boot应用所在机器的IP:

bind-address = 0.0.0.0

修改后重启MySQL服务:

sudo systemctl restart mysql

步骤2:授权数据库用户远程访问

登录MySQL服务器,执行以下SQL给boss用户授权从任意IP访问test数据库:

GRANT ALL PRIVILEGES ON test.* TO 'boss'@'%' IDENTIFIED BY 'StrongPass123!';
FLUSH PRIVILEGES;

若需限制特定IP访问,将%替换为Spring Boot应用所在机器的IP。

3. 开放Ubuntu虚拟机防火墙的3306端口

  • 若使用ufw防火墙:
sudo ufw allow 3306/tcp
sudo ufw reload
  • 若使用iptables防火墙:
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
sudo iptables-save

4. 验证网络连通性

在Spring Boot应用所在机器上,用以下命令测试能否连接到虚拟机的3306端口:

# 使用telnet
telnet 10.0.0.200 3306
# 或使用nc
nc -zv 10.0.0.200 3306

若连接失败,需排查虚拟机的网络配置、路由规则等问题。

5. 适配MySQL驱动与Hibernate方言版本

你使用的是mysql-connector-java-8.0.29,但Hibernate方言配置的是MySQL 5.x版本,建议更换为MySQL 8.x对应的方言:

spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL8Dialect

内容的提问来源于stack exchange,提问作者beatmaister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:09:24