Integra Spanner con Spring Data JPA (dialecto de PostgreSQL)

Spring Data JPA, que forma parte de la gran familia Spring Data, facilita la implementar repositorios basados en JPA. Spring Data JPA es compatible con 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 el portabilidad de tu aplicación de un sistema de base de datos a otro.

Configura Spring Data JPA para las bases de datos de PostgreSQL de Spanner

Puedes integrar bases de datos de dialectos de PostgreSQL de Spanner a Spring Data JPA con el dialecto estándar de Hibernate de PostgreSQL PGAdapter.

Para ver un ejemplo, consulta la guía completa aplicación de ejemplo funcional GitHub.

Dependencias

En tu proyecto, agrega las dependencias de Apache Maven para Spring Data JPA. el controlador JDBC de PostgreSQL y PGAdapter.

  <dependencies>
    <!-- Spring Data JPA -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- Add the PostgreSQL JDBC driver -->
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
    </dependency>
    <!-- Add PGAdapter as a dependency, so we can start it in-process -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-spanner-pgadapter</artifactId>
    </dependency>
  </dependencies>

Iniciar PGAdapter en proceso

Agrega el siguiente método a tu aplicación para iniciar PGAdapter directamente desde tu aplicación de Java. PGAdapter se ejecuta en la misma JVM que tu aplicación, y esta se conecta a PGAdapter en localhost:port

  /** Starts PGAdapter in-process and returns a reference to the server. */
  static ProxyServer startPGAdapter() {
    // Start PGAdapter using the default credentials of the runtime environment on port 9432.
    OptionsMetadata options = OptionsMetadata.newBuilder().setPort(9432).build();
    ProxyServer server = new ProxyServer(options);
    server.startServer();
    server.awaitRunning();

    return server;
  }

Configuración

Configura application.properties para usar Hibernate de PostgreSQL Dialect y el controlador de JDBC de PostgreSQL. Configura PostgreSQL Controlador JDBC para conectarse a una base de datos de dialectos de PostgreSQL a través de PGAdapter.

# The example uses the standard PostgreSQL Hibernate dialect.
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

# Defining these properties here makes it a bit easier to build the connection string.
# Change these to match your Cloud Spanner PostgreSQL-dialect database.
spanner.project=my-project
spanner.instance=my-instance
spanner.database=my-database
# This setting ensures that PGAdapter automatically commits the current transaction if it encounters
# a DDL statement in a read/write transaction, and then executes the DDL statements as a single DDL
# batch. 
spanner.ddl_transaction_mode=options=-c%20spanner.ddl_transaction_mode=AutocommitExplicitTransaction

# This is the connection string to PGAdapter running in-process.
spring.datasource.url=jdbc:postgresql://localhost:9432/projects%2F${spanner.project}%2Finstances%2F${spanner.instance}%2Fdatabases%2F${spanner.database}?${spanner.ddl_transaction_mode}

# You can display SQL statements and stats for debugging if needed.
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true

# Enable JDBC batching.
spring.jpa.properties.hibernate.jdbc.batch_size=100
spring.jpa.properties.hibernate.order_inserts=true

Aplicación de muestra completa

Una aplicación de ejemplo funcional es disponibles en GitHub.

¿Qué sigue?