Integrar Spanner con Spring Data JDBC (PostgreSQL)

Spring Data JDBC, que forma parte de la familia Spring Data, facilita la implementación de repositorios basados en JDBC en tu aplicación. Spring Data JDBC es compatible con PostgreSQL y otros sistemas de bases de datos. Añade una capa de abstracción entre tu aplicación y tu base de datos, lo que facilita la portabilidad de tu aplicación de un sistema de base de datos a otro.

Configurar Spring Data JDBC para bases de datos con dialecto PostgreSQL de Spanner

Puede integrar bases de datos de Spanner con dialecto PostgreSQL en Spring Data JDBC mediante el dialecto PostgreSQL estándar que se incluye en Spring Data JDBC y el controlador JDBC de Spanner.

No es necesario usar PGAdapter para esta integración.

Configuración de dialecto

Spring Data JDBC selecciona el dialecto de la base de datos que utiliza en función del controlador JDBC que se haya configurado como fuente de datos en Spring Data. Debes añadir una clase de configuración de Spring adicional a tu aplicación para indicar a Spring Data JDBC que use el dialecto de PostgreSQL cuando se utilice el controlador JDBC de Spanner:

@Configuration
public class JdbcConfiguration extends AbstractJdbcConfiguration {

  /** Override the dialect auto-detection, so it also returns PostgreSQL for Spanner. */
  @Override
  public Dialect jdbcDialect(@Nonnull NamedParameterJdbcOperations operations) {
    if (isCloudSpannerPG(operations.getJdbcOperations())) {
      return PostgresDialect.INSTANCE;
    }
    return super.jdbcDialect(operations);
  }

  /** Returns true if the current database is a Spanner PostgreSQL-dialect database. */
  public static boolean isCloudSpannerPG(JdbcOperations operations) {
    return Boolean.TRUE.equals(
        operations.execute(
            (ConnectionCallback<Boolean>)
                connection ->
                    connection.isWrapperFor(CloudSpannerJdbcConnection.class)
                        && com.google.cloud.spanner.Dialect.POSTGRESQL.equals(
                            connection.unwrap(CloudSpannerJdbcConnection.class).getDialect())));
  }
}

Para ver un ejemplo, consulta la aplicación de ejemplo funcional completa en GitHub.

Dependencias

En tu proyecto, añade las dependencias de Apache Maven para Spring Data JDBC y el controlador JDBC de Spanner.

<dependencies>
  <!-- Spring Data JDBC -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
  </dependency>

  <!-- Spanner JDBC driver -->
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-spanner-jdbc</artifactId>
  </dependency>
<dependencies>

Configuración de la fuente de datos

Configura application.properties para que use el controlador JDBC de Spanner y conéctate a una base de datos de Spanner con dialecto PostgreSQL.

# This profile uses a Spanner PostgreSQL database.

spanner.project=my-project
spanner.instance=my-instance
spanner.database=spring-data-jdbc

spring.datasource.driver-class-name=com.google.cloud.spanner.jdbc.JdbcDriver
spring.datasource.url=jdbc:cloudspanner:/projects/${spanner.project}/instances/${spanner.instance}/databases/${spanner.database}

Aplicación de ejemplo completa

Para probar esta integración con una aplicación de ejemplo, consulta Aplicación de ejemplo de Spring Data JDBC con Spanner PostgreSQL.

Siguientes pasos