153. Spring JDBC

Spring Cloud GCP 添加了与Spring JDBC的集成,因此您可以使用 Spring JDBC 或依赖于它的其他库(例如 Spring Data JPA)在 Google Cloud SQL 中运行 MySQL 或 PostgreSQL 数据库。

Spring SQL GCP 以两个 Spring Boot 启动器的形式提供 Cloud SQL 支持,一个用于 MySQL,另一个用于 PostgreSQL。Starter者的作用是从属性中读取配置并采用默认设置,以便用户体验尽可能简单地连接到 MySQL 和 PostgreSQL。

使用 Spring Cloud GCP BOM 进行 Maven 坐标:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-postgresql</artifactId>
</dependency>

Gradle coordinates:

dependencies {
    compile group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter-sql-mysql'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter-sql-postgresql'
}

153.1 Prerequisites

为了将 Spring Boot Starters 用于 Google Cloud SQL,必须在您的 GCP 项目中启用 Google Cloud SQL API。

为此,请转到 Google Cloud Console 的API 库页面,搜索“ Cloud SQL API”,单击第一个结果并启用该 API。

Note

有几个类似的“ Cloud SQL”结果。您必须访问一个“ Google Cloud SQL API”并从那里启用该 API。

153.2 Google Cloud SQL 的 Spring Boot Starter

Google Cloud SQL 的 Spring Boot Starters 提供了一个自动配置的DataSource对象。与 Spring JDBC 结合使用,它提供了一个JdbcTemplate对象 bean,该 bean 允许执行诸如查询和修改数据库之类的操作。

public List<Map<String, Object>> listUsers() {
    return jdbcTemplate.queryForList("SELECT * FROM user;");
}

您可以依靠Spring Boot 数据源自动配置配置DataSource bean。换句话说,可以使用诸如 SQL 用户名spring.datasource.username和密码spring.datasource.password之类的属性。还有一些特定于 Google Cloud SQL 的配置:

Property nameDescriptionDefault value如果指定的属性,则未使用
spring.cloud.gcp.sql.enabled启用或禁用 Cloud SQL 自动配置true
spring.cloud.gcp.sql.database-name要连接的数据库的名称。 spring.datasource.url
spring.cloud.gcp.sql.instance-connection-name包含 Google Cloud SQL 实例的项目 ID,区域和名称的字符串,每个字符串之间用冒号分隔。例如my-project-id:my-region:my-instance-name spring.datasource.url
spring.cloud.gcp.sql.credentials.locationGoogle OAuth2 凭证私钥文件的文件系统路径。用于验证和授权与 Google Cloud SQL 实例的新连接。Spring GCP Boot 启动程序提供的默认凭证
spring.cloud.gcp.sql.credentials.encoded-keyOAuth2 帐户私钥的 Base64 编码内容,采用 JSON 格式。用于验证和授权与 Google Cloud SQL 实例的新连接。Spring GCP Boot 启动程序提供的默认凭证

153.2.1 数据源创建流程

基于先前的属性,用于 Google Cloud SQL 的 Spring Boot 启动程序会创建一个CloudSqlJdbcInfoProvider对象,该对象用于获取实例的 JDBC URL 和驱动程序类名称。如果您提供自己的CloudSqlJdbcInfoProvider bean,那么将使用它,并且将忽略与构建 JDBC URL 或驱动程序类相关的属性。

为了使用CloudSqlJdbcInfoProvider提供的 JDBC URL 和驱动程序类名称,对 Spring Boot Autoconfigure 提供的DataSourceProperties对象进行了更改,除非在属性中提供了这些值。凭证工厂在DataSourceProperties突变步骤中的系统属性中注册为SqlCredentialFactory

DataSource创建委托给Spring Boot。您可以通过将它们的依赖项添加到 Classpath选择连接池的类型(例如 Tomcat,HikariCP 等)。

将创建的DataSource与 Spring JDBC 结合使用,可以为您提供一个完全配置且可操作的JdbcTemplate对象,您可以使用该对象与 SQL 数据库进行交互。您可以使用最少的数据库和实例名称连接到数据库。

153.2.2 故障排除提示

Connection issues

如果您无法连接到数据库并看到Connecting to Cloud SQL instance […] on IP […]无休止的循环,则可能会以低于 Logger 级别的级别引发和记录异常。如果您的 Logger 设置为 INFO 或更高级别,则 HikariCP 可能就是这种情况。

要查看后台发生了什么,您应该在应用程序资源文件夹中添加一个logback.xml文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml"/>
  <logger name="com.zaxxer.hikari.pool" level="DEBUG"/>
</configuration>

类似 c.g.cloud.sql.core.SslSocketFactory 之类的错误:由于尝试在错误后过早刷新实例信息而重新抛出了缓存的异常

如果您在循环中看到很多类似这样的错误并且无法连接到数据库,则通常是一种征兆,表示在您的凭据权限下出现了某些错误,或者未启用 Google Cloud SQL API。验证是否已在 Cloud Console 中启用了 Google Cloud SQL API,并且您的服务帐户具有IAM 的必要角色

要找出导致问题的原因,您可以启用above提到的 DEBUG 日志记录级别。

PostgreSQL:java.net.SocketException:已连接问题

如果您的 Maven 项目的父级是spring-boot版本1.5.x,或者在任何其他情况下会导致org.postgresql:postgresql依赖项的版本较旧(例如9.4.1212.jre7),则我们会发现这种 exceptions 很常见。

要解决此问题,请以正确的版本重新声明依赖项。例如,在 Maven 中:

<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>42.1.1</version>
</dependency>

153.3 Samples

可用的示例应用程序和代码实验室: