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

