Integre o Spanner com o Spring Data JPA (dialeto PostgreSQL)

O Spring Data JPA, que faz parte da família Spring Data mais ampla, facilita a implementação de repositórios baseados em JPA. O Spring Data JPA suporta o PostgreSQL e uma vasta gama de outros sistemas de bases de dados. Adiciona uma camada de abstração entre a sua aplicação e a sua base de dados que facilita a portabilidade da sua aplicação de um sistema de base de dados para outro.

Configure o Spring Data JPA para bases de dados com dialeto PostgreSQL do Spanner

Pode integrar bases de dados com dialeto PostgreSQL do Spanner com o Spring Data JPA usando o dialeto Hibernate PostgreSQL padrão e o PGAdapter.

Para ver um exemplo, consulte a aplicação de exemplo funcional completa no GitHub.

Dependências

No seu projeto, adicione dependências do Apache Maven para Spring Data JPA, o controlador JDBC do PostgreSQL e o 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>

Inicie o PGAdapter no processo

Adicione o seguinte método à sua aplicação para iniciar o PGAdapter diretamente a partir da sua aplicação Java. O PGAdapter é executado na mesma JVM que a sua aplicação, e a aplicação liga-se ao PGAdapter em 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;
  }

Configuração

Configure o application.properties para usar o dialeto do Hibernate do PostgreSQL e o controlador JDBC do PostgreSQL. Configure o controlador JDBC do PostgreSQL para se ligar a uma base de dados de dialeto PostgreSQL através do 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

Aplicação de exemplo completa

Está disponível uma aplicação de exemplo funcional no GitHub.

O que se segue?