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

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的访问凭证,解决方法如下:

  • 方法一:设置环境变量(推荐)
    1. 在Cloud Console的IAM -> 服务账号页面,找到对应服务账号(或新建一个具有Cloud SQL Client权限的服务账号)
    2. 创建并下载JSON格式的密钥文件
    3. 设置环境变量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
  • 方法二:在代码中指定凭证路径(仅测试用)
    在你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:45:17