Spring Boot应用无法连接Google Cloud SQL(MySQL)求助
连接Cloud SQL数据库时遇到Application Default Credentials缺失报错
报错堆栈
com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Could not create connection to database server. at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:596) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:582) [省略部分堆栈] ... 74 more Caused by: java.lang.RuntimeException: Unable to obtain credentials to communicate with the Cloud SQL API at com.google.cloud.sql.core.CoreSocketFactory$ApplicationDefaultCredentialFactory.create(CoreSocketFactory.java:392) [省略部分堆栈] ... 83 more Caused by: java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. at com.google.auth.oauth2.DefaultCredentialsProvider.getDefaultCredentials(DefaultCredentialsProvider.java:125) at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:125) [省略部分堆栈] ... 91 more
依赖配置
<dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-dependencies</artifactId> <version>3.3.0</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.31</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.google.cloud.sql</groupId> <artifactId>mysql-socket-factory</artifactId> <version>1.11.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign-core</artifactId> <version>4.0.1</version> </dependency>
配置类
@Configuration public class DatabaseConfig { @Bean public static DataSource dataSource() { HikariConfig config = new HikariConfig(); config.setJdbcUrl(String.format("jdbc:mysql://google/%s", <database-name>)); config.setUsername(<username>); config.setPassword(<password>); config.setMaximumPoolSize(5); config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory"); config.addDataSourceProperty("cloudSqlInstance", "<project-id>:<location>:<instance-name>"); return new HikariDataSource(config); } }
已做排查
- 检查配置:保留Google Cloud指南中的基础配置,疑问
<database-name>是否与控制台数据库名、Cloud Shell中USE命令的名称一致 - 数据库设置:确认数据库可用,用户名密码可正常执行SQL,已开启公网访问和sqladmin API
- 尝试调整依赖,无明显效果
- 代码层面:通过DataSource创建JdbcTemplate调用queryForObject,判断代码逻辑无问题
问题解决与优化建议
1. 关于<database-name>的确认
是的,<database-name>就是Cloud SQL控制台中数据库列表里的名称,和你在Cloud Shell执行USE <database-name>时的名称完全一致,这部分你的理解是对的。
2. 核心问题:Application Default Credentials缺失
报错的根源是本地运行时没有提供Google Cloud的访问凭证,解决方法如下:
- 方法一:设置环境变量(推荐)
- 在Cloud Console的IAM -> 服务账号页面,找到对应服务账号(或新建一个具有Cloud SQL Client权限的服务账号)
- 创建并下载JSON格式的密钥文件
- 设置环境变量
GOOGLE_APPLICATION_CREDENTIALS指向该文件路径:- Windows:
set GOOGLE_APPLICATION_CREDENTIALS=C:\your-path\key-file.json - Linux/Mac:
export GOOGLE_APPLICATION_CREDENTIALS=/your-path/key-file.json
- Windows:
- 方法二:在代码中指定凭证路径(仅测试用)
在你的DatabaseConfig中添加一行配置:config.addDataSourceProperty("credentialsFile", "/your-path/key-file.json");
3. 依赖优化
你的依赖基本可用,但可以简化:
- 添加
spring-cloud-gcp-starter-sql-mysql依赖,它会自动引入mysql-socket-factory等必要依赖,无需手动配置SocketFactory:<dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId> <version>3.3.0</version> </dependency> - 可以将
mysql-connector-java替换为新的artifactIdmysql-connector-j(官方推荐,8.0.31版本支持):<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.31</version> <scope>runtime</scope> </dependency>
4. 配置简化(替代自定义配置类)
可以删除自定义的DatabaseConfig,改用application.properties配置:
spring.datasource.url=jdbc:mysql://google/<database-name>?cloudSqlInstance=<project-id>:<location>:<instance-name>&socketFactory=com.google.cloud.sql.mysql.SocketFactory spring.datasource.username=<username> spring.datasource.password=<password> spring.datasource.hikari.maximum-pool-size=5 # 若需要指定凭证文件,添加以下配置 spring.cloud.gcp.sql.credentials.location=file:/your-path/key-file.json
内容的提问来源于stack exchange,提问作者Cheryl
相关产品推荐
相关产品推荐

