配置hibernate.cfg.xml连接Google Cloud MySQL实例报错求助
解决Hibernate连接Google Cloud SQL MySQL实例的配置问题
首先看你遇到的java.net.UnknownHostException: Google错误,核心问题出在JDBC URL的配置上——你写的jdbc:mysql://google/DB_Name里的google是无效的主机名,Google Cloud SQL的Socket Factory不需要指定真实的主机地址,正确的URL格式应该把主机部分留空或者用localhost。
正确的hibernate.cfg.xml配置
把你的连接配置改成下面这样:
<property name="connection.driver.class">com.mysql.cj.jdbc.Driver</property> <!-- 注意:MySQL 8+版本推荐使用cj包下的驱动,旧驱动已废弃 --> <property name="connection.url">jdbc:mysql:///<DB_Name>?cloudSqlInstance=INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false</property> <property name="connection.username">User_Name</property> <property name="connection.password">Password</property> <!-- 可选:添加连接池优化配置,避免频繁创建连接 --> <property name="hibernate.c3p0.max_size">10</property> <property name="hibernate.c3p0.min_size">2</property> <property name="hibernate.c3p0.timeout">1800</property>
关键注意事项
- JDBC URL格式:主机部分用
//(直接留空)或者//localhost即可,Socket Factory会自动处理和Cloud SQL实例的加密连接,不需要手动填写实例的IP或域名。 - 依赖包必须齐全:你的项目里必须包含
mysql-socket-factory依赖,否则Socket Factory无法正常工作。
Maven依赖配置:
Gradle依赖配置:<dependency> <groupId>com.google.cloud.sql</groupId> <artifactId>mysql-socket-factory</artifactId> <version>1.11.0</version> <!-- 建议使用最新稳定版 --> </dependency>implementation 'com.google.cloud.sql:mysql-socket-factory:1.11.0' - 权限与认证:
- 如果你的应用部署在GCP内部(比如App Engine、GKE),会自动使用默认服务账号,只要给该账号分配
Cloud SQL Client权限即可。 - 如果是本地开发,需要先通过
gcloud auth application-default login登录你的GCP账号,并且确保该账号有访问目标Cloud SQL实例的权限。
- 如果你的应用部署在GCP内部(比如App Engine、GKE),会自动使用默认服务账号,只要给该账号分配
- 驱动版本兼容:如果你的MySQL实例是8.0及以上版本,一定要使用
com.mysql.cj.jdbc.Driver,旧的com.mysql.jdbc.Driver会存在兼容性问题。
快速排查步骤
- 确认
INSTANCE_CONNECTION_NAME是GCP控制台里显示的实例连接名,格式为项目ID:区域:实例名,不要填错。 - 用纯JDBC代码测试连接,排除Hibernate的配置干扰:
import java.sql.Connection; import java.sql.DriverManager; public class TestCloudSqlConnection { public static void main(String[] args) { String url = "jdbc:mysql:///<DB_Name>?cloudSqlInstance=INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=User_Name&password=Password"; try (Connection conn = DriverManager.getConnection(url)) { System.out.println("连接Cloud SQL成功!"); } catch (Exception e) { e.printStackTrace(); } } }
- 检查本地开发环境是否已经通过GCP CLI完成认证,或者部署环境的服务账号是否有足够权限。
内容的提问来源于stack exchange,提问作者Mehul Changani
相关产品推荐
相关产品推荐

