Integra Spanner con Spring Data JDBC (PostgreSQL)

Spring Data JDBC, que forma parte de la gran familia de Spring Data, facilita la implementación de repositorios basados en JDBC en tu aplicación. Spring Data JDBC admite PostgreSQL y otros sistemas de bases de datos. Agrega una capa de abstracción entre tu aplicación y tu base de datos que facilita la portabilidad de tu aplicación de un sistema de base de datos a otro.

Configura Spring Data JDBC para bases de datos de dialecto de PostgreSQL de Spanner

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

No es necesario que uses PGAdapter para esta integración.

Configuración del dialecto

Spring Data JDBC selecciona el dialecto de la base de datos que usa en función del controlador de JDBC que se configuró como fuente de datos en Spring Data. Debes agregar una clase de configuración de Spring adicional a tu aplicación para indicarle a Spring Data JDBC que use el dialecto de PostgreSQL cuando se use el controlador de 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 muestra en funcionamiento completa en GitHub.

Dependencias

En tu proyecto, agrega 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 usar el controlador JDBC de Spanner y conectarte a una base de datos de dialecto PostgreSQL de Spanner.

# 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 la aplicación de ejemplo de JDBC de Spring Data con PostgreSQL de Spanner.

¿Qué sigue?