Objetivos
Este tutorial explica os seguintes passos através do controlador JDBC do Spanner:
- Crie uma instância e uma base de dados do Spanner.
- Escrever, ler e executar consultas SQL em dados na base de dados.
- Atualize o esquema da base de dados.
- Atualize os dados através de uma transação de leitura/escrita.
- Adicione um índice secundário à base de dados.
- Use o índice para ler e executar consultas SQL em dados.
- Recuperar dados através de uma transação só de leitura.
Custos
Este tutorial usa o Spanner, que é um componente faturável do Google Cloud. Para obter informações sobre o custo de utilização do Spanner, consulte a secção Preços.
Antes de começar
Conclua os passos descritos em Configuração, que abrangem a criação e a definição de um projeto Google Cloud predefinido, a ativação da faturação, a ativação da API Cloud Spanner e a configuração do OAuth 2.0 para obter credenciais de autenticação para usar a API Cloud Spanner.
Em particular, certifique-se de que executa gcloud auth
application-default login
para configurar o seu ambiente de desenvolvimento local com
credenciais de autenticação.
Prepare o seu ambiente JDBC local
Instale o seguinte no seu computador de desenvolvimento, se ainda não estiver instalado:
- JDK Java 8 (transferir).
- Maven 3 (transferência).
Clone o repositório da app de exemplo para a sua máquina local:
git clone https://github.com/googleapis/java-spanner-jdbc.git
Altere para o diretório que contém o código de exemplo do Spanner:
cd java-spanner-jdbc/samples/snippets
Crie uma instância
Quando usa o Spanner pela primeira vez, tem de criar uma instância, que é uma atribuição de recursos usados pelas bases de dados do Spanner. Quando cria uma instância, escolhe uma configuração da instância, que determina onde os seus dados são armazenados, bem como o número de nós a usar, o que determina a quantidade de recursos de publicação e armazenamento na sua instância.
Consulte o artigo Crie uma instância
para saber como criar uma instância do Spanner através de qualquer um dos
seguintes métodos. Pode dar o nome test-instance
à sua instância para a usar com outros tópicos neste documento que façam referência a uma instância com o nome test-instance
.
- A CLI do Google Cloud
- A Google Cloud consola
- Uma biblioteca cliente (C++, C#, Go, Java, Node.js, PHP, Python ou Ruby)
Explore ficheiros de exemplo
O repositório de exemplos contém um exemplo que mostra como usar o Spanner com JDBC.
Opom.xml
adiciona o controlador JDBC do Spanner às dependências do projeto e configura o plugin de montagem para criar um ficheiro JAR executável com a classe Java definida neste tutorial.
Crie a amostra a partir do
diretório samples/snippets
:
mvn package -DskipTests
Crie uma base de dados
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
createdatabase test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
createpgdatabase test-instance example-db
Deve ver:
Created database [projects/my-project/instances/test-instance/databases/example-db]
GoogleSQL
PostgreSQL
O passo seguinte é escrever dados na sua base de dados.
Crie uma ligação JDBC
Antes de poder fazer leituras ou escritas, tem de criar umConnection
. Todas as suas interações com o Spanner têm de passar por um Connection
. O nome da base de dados e outras propriedades são especificados no URL de ligação JDBC e no conjunto java.util.Properties
.
GoogleSQL
PostgreSQL
Para ver uma lista completa das propriedades suportadas, consulte o artigo Propriedades do URL de ligação.
Cada Connection
usa recursos, por isso, é uma boa prática fechar as ligações quando já não são necessárias ou usar um conjunto de ligações para reutilizar as ligações em toda a sua aplicação.
Leia mais na referência Connection
Javadoc.
Ligue o controlador JDBC ao emulador
Pode ligar o controlador JDBC ao emulador do Spanner de duas formas:
- Defina a variável de ambiente
SPANNER_EMULATOR_HOST
: isto indica ao controlador JDBC que se ligue ao emulador. A instância e a base de dados do Spanner no URL de ligação JDBC já têm de existir no emulador. - Adicione
autoConfigEmulator=true
ao URL de ligação: isto indica ao controlador JDBC que se ligue ao emulador e crie automaticamente a instância e a base de dados do Spanner no URL de ligação JDBC, se estas não existirem.
Este exemplo mostra como usar a opção de autoConfigEmulator=true
URL de associação.
GoogleSQL
PostgreSQL
Escreva dados com DML
Pode inserir dados através da linguagem de manipulação de dados (DML) numa transação de leitura/escrita.
Use o método PreparedStatement.executeUpdate()
para executar uma declaração DML.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdml test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdmlpg test-instance example-db
Deve ver:
4 records inserted.
Escreva dados com um lote de DML
Usa os métodosPreparedStatement#addBatch()
e PreparedStatement#executeBatch()
para executar várias declarações DML num lote.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdmlbatch test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdmlbatchpg test-instance example-db
Deve ver:
3 records inserted.
Escreva dados com mutações
Também pode inserir dados através de alterações.
Pode escrever dados usando um objeto Mutation
.
Um objeto Mutation
é um contentor para operações de mutação. Uma Mutation
representa uma sequência de inserções, atualizações e eliminações que o Spanner
aplica atomicamente a diferentes linhas e tabelas numa base de dados do Spanner.
O método newInsertBuilder()
na classe Mutation
cria uma mutação INSERT
, que insere uma
nova linha numa tabela. Se a linha já existir, a gravação falha. Em alternativa,
pode usar o método newInsertOrUpdateBuilder
para criar uma mutação INSERT_OR_UPDATE
, que atualiza os valores das colunas
se a linha já existir.
write()
na interface CloudSpannerJdbcConnection
escreve as mutações. Todas as mutações num único lote são aplicadas de forma atómica.
Pode desagrupar a interface CloudSpannerJdbcConnection
de um Connection
do Spanner JDBC.
Este código mostra como escrever os dados através de mutações:
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
write test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writepg test-instance example-db
Deve ver:
Inserted 10 rows.
Consultar dados através de SQL
O Spanner suporta uma interface SQL para ler dados, à qual pode aceder na linha de comandos através da CLI Google Cloud ou programaticamente através do controlador JDBC do Spanner.
Na linha de comandos
Execute a seguinte declaração SQL para ler os valores de todas as colunas da tabela Albums
:
GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
PostgreSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
O resultado mostra:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Use o controlador JDBC do Spanner
Além de executar uma declaração SQL na linha de comandos, pode emitir a mesma declaração SQL de forma programática através do controlador JDBC do Spanner.
Os seguintes métodos e classes são usados para executar a consulta SQL:- O método
createStatement()
na interfaceConnection
: use-o para criar um novo objeto de declaração para executar uma declaração SQL. - O método
executeQuery(String)
da classeStatement
: use este método para executar uma consulta numa base de dados. - A classe
Statement
use-a para executar uma string SQL. - A classe
ResultSet
: use-a para aceder aos dados devolvidos por uma declaração SQL.
Veja como emitir a consulta e aceder aos dados:
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
query test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querypg test-instance example-db
Deverá ver o seguinte resultado:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Consultar através de um parâmetro SQL
Se a sua aplicação tiver uma consulta executada com frequência, pode melhorar o respetivo desempenho parametrizando-a. A consulta paramétrica resultante pode ser colocada em cache e reutilizada, o que reduz os custos de compilação. Para mais informações, consulte o artigo Use parâmetros de consulta para acelerar as consultas executadas com frequência.
Segue-se um exemplo da utilização de um parâmetro na cláusula WHERE
para consultar registos que contêm um valor específico para LastName
.
Use um java.sql.PreparedStatement
para executar uma consulta com um parâmetro.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querywithparameter test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querywithparameterpg test-instance example-db
Deverá ver o seguinte resultado:
12 Melissa Garcia
Atualize o esquema da base de dados
Suponha que precisa de adicionar uma nova coluna denominada MarketingBudget
à tabela Albums
. A adição de uma nova coluna a uma tabela existente requer uma atualização ao esquema da base de dados. O Spanner suporta atualizações de esquemas a uma base de dados enquanto a base de dados continua a servir tráfego. As atualizações do esquema não requerem que a base de dados fique offline e não bloqueiam tabelas nem colunas inteiras. Pode continuar a escrever dados na base de dados durante a atualização do esquema. Leia mais acerca das atualizações de esquemas suportadas e do desempenho das alterações de esquemas em Faça atualizações de esquemas.
Adicione uma coluna
Pode adicionar uma coluna na linha de comandos através da CLI Google Cloud ou programaticamente através do controlador JDBC do Spanner.
Na linha de comandos
Use o seguinte comando ALTER TABLE
para
adicionar a nova coluna à tabela:
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE albums ADD COLUMN marketing_budget BIGINT'
Deve ver:
Schema updating...done.
Use o controlador JDBC do Spanner
Use o métodoexecute(String)
da classe java.sql.Statement
para modificar o esquema:
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
addmarketingbudget test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
addmarketingbudgetpg test-instance example-db
Deve ver:
Added MarketingBudget column.
Execute um lote de LDD
Recomendamos que execute várias modificações do esquema num lote. Use o método
addBatch(String)
java.sql.Statement
para adicionar várias declarações DDL a um lote.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
ddlbatch test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
ddlbatchpg test-instance example-db
Deve ver:
Added Venues and Concerts tables.
Escreva dados na nova coluna
O código seguinte escreve dados na nova coluna. Define MarketingBudget
como 100000
para a linha identificada por Albums(1, 1)
e como 500000
para a linha identificada por Albums(2, 2)
.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
update test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
updatepg test-instance example-db
Deverá ver uma saída semelhante a esta:
Updated albums
Também pode executar uma consulta SQL ou uma chamada de leitura para obter os valores que acabou de escrever.
Aqui está o código para executar a consulta:
GoogleSQL
PostgreSQL
Para executar esta consulta, execute o seguinte comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querymarketingbudget test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querymarketingbudgetpg test-instance example-db
O resultado mostra:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
Atualize os dados
Pode atualizar dados através de DML numa transação de leitura/escrita.
Defina AutoCommit=false
para executar transações de leitura/escrita no JDBC.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writewithtransactionusingdml test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writewithtransactionusingdmlpg test-instance example-db
Etiquetas de transação e etiquetas de pedidos
Use etiquetas de transações e etiquetas de pedidos
para resolver problemas de transações e consultas no Spanner. Pode definir etiquetas de transações e etiquetas de pedidos no JDBC com as variáveis de sessão TRANSACTION_TAG
e STATEMENT_TAG
.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
tags test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
tagspg test-instance example-db
Obtenha dados através de transações só de leitura
Suponhamos que quer executar mais do que uma leitura na mesma data/hora. As transações de leitura exclusiva observam um prefixo
consistente do histórico de confirmações de transações, pelo que a sua aplicação recebe sempre
dados consistentes.
Defina ReadOnly=true
e AutoCommit=false
num java.sql.Connection
ou use a declaração SQL SET TRANSACTION READ ONLY
para executar uma transação de leitura exclusiva.
O exemplo seguinte mostra como executar uma consulta e fazer uma leitura na mesma transação só de leitura:
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
readonlytransaction test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
readonlytransactionpg test-instance example-db
Deverá ver uma saída semelhante à seguinte:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
Consultas particionadas e aumento de dados
A API partitionQuery
divide uma consulta em partes mais pequenas, ou partições, e usa várias máquinas para obter as partições em paralelo. Cada partição é identificada por um token de partição. A API PartitionQuery tem uma latência superior à da API de consulta padrão, porque destina-se apenas a operações em massa, como exportar ou analisar toda a base de dados.
O Data Boost permite-lhe executar consultas de estatísticas e exportações de dados com um impacto quase nulo nos fluxos de trabalho existentes na instância do Spanner aprovisionada. A otimização de dados só suporta consultas particionadas.
GoogleSQL
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
databoost test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
databoostpg test-instance example-db
Para mais informações sobre a execução de consultas particionadas e a utilização do Data Boost com o controlador JDBC, consulte:
- GoogleSQL: Data Boost e declarações de consultas particionadas
- PostgreSQL: Data Boost e declarações de consultas particionadas
DML particionada
A linguagem de manipulação de dados (DML) particionada foi concebida para os seguintes tipos de atualizações e eliminações em massa:
- Limpeza periódica e recolha de lixo.
- Preencher novas colunas com valores predefinidos.
PostgreSQL
Execute o exemplo com este comando:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
pdml test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
pdmlpg test-instance example-db
Para mais informações sobre a funcionalidade AUTOCOMMIT_DML_MODE
, consulte:
Limpeza
Para evitar incorrer em cobranças adicionais na sua conta do Cloud Billing pelos recursos usados neste tutorial, elimine a base de dados e a instância que criou.
Elimine a base de dados
Se eliminar uma instância, todas as bases de dados na mesma são eliminadas automaticamente. Este passo mostra como eliminar uma base de dados sem eliminar uma instância (continua a incorrer em custos pela instância).
Na linha de comandos
gcloud spanner databases delete example-db --instance=test-instance
Usar a Google Cloud consola
Aceda à página Instâncias do Spanner na Google Cloud consola.
Clique na instância.
Clique na base de dados que quer eliminar.
Na página Detalhes da base de dados, clique em Eliminar.
Confirme que quer eliminar a base de dados e clique em Eliminar.
Elimine a instância
A eliminação de uma instância elimina automaticamente todas as bases de dados criadas nessa instância.
Na linha de comandos
gcloud spanner instances delete test-instance
Usar a Google Cloud consola
Aceda à página Instâncias do Spanner na Google Cloud consola.
Clique na instância.
Clique em Eliminar.
Confirme que quer eliminar a instância e clique em Eliminar.
O que se segue?
- Saiba como integrar o Spanner com o Spring Data JPA (dialeto GoogleSQL).
- Saiba como integrar o Spanner com o Spring Data JPA (dialeto PostgreSQL).
- Saiba como integrar o Spanner com o Hibernate ORM (dialeto GoogleSQL).
- Saiba comointegrar o Spanner com o Hibernate ORM (dialeto PostgreSQL).
- Saiba mais sobre os comandos de gestão de sessões JDBC (GoogleSQL).
- Saiba mais acerca dos comandos de gestão de sessões JDBC (PostgreSQL).
Saiba como aceder ao Spanner com uma instância de máquina virtual.
Saiba mais sobre as credenciais de autorização e autenticação em Autenticação em serviços na nuvem através de bibliotecas cliente.
Saiba mais acerca das práticas recomendadas de criação de esquemas do Spanner.