Objetivos
En este tutorial se explican los siguientes pasos para usar el controlador JDBC de Spanner:
- Crea una instancia y una base de datos de Spanner.
- Escribir, leer y ejecutar consultas SQL sobre datos en la base de datos.
- Actualizar el esquema de la base de datos.
- Actualizar datos mediante una transacción de lectura y escritura.
- Agregar un índice secundario a la base de datos.
- Usar el índice para leer los datos y ejecutar consultas SQL sobre ellos.
- Recuperar datos mediante una transacción de solo lectura.
Costes
En este tutorial se usa Spanner, que es un componente facturable deGoogle Cloud. Para obtener información sobre el coste de usar Spanner, consulta la página Precios.
Antes de empezar
Sigue los pasos que se describen en la sección Configuración, donde se explica cómo crear y definir un proyecto predeterminado Google Cloud , habilitar la facturación y la API Cloud Spanner, y configurar OAuth 2.0 para obtener las credenciales de autenticación que se usarán con la API Cloud Spanner.
En concreto, asegúrate de ejecutar gcloud auth
application-default login
para configurar tu entorno de desarrollo local con credenciales de autenticación.
Preparar el entorno JDBC local
Instala los elementos indicados a continuación en la máquina de desarrollo si aún no están instalados:
Clona el repositorio de aplicaciones de muestra en la máquina local:
git clone https://github.com/googleapis/java-spanner-jdbc.git
Cambia al directorio que contiene el código de ejemplo de Spanner:
cd java-spanner-jdbc/samples/snippets
Crear una instancia
La primera vez que uses Spanner, debes crear una instancia, que es una asignación de recursos que utilizan las bases de datos de Spanner. Cuando creas una instancia, tienes que elegir una configuración de instancia, que determina dónde se almacenan tus datos y la cantidad de nodos que se van a usar, lo que permite conocer la cantidad de recursos de almacenamiento y publicación de la instancia.
Consulta Crear una instancia para saber cómo crear una instancia de Spanner con cualquiera de los siguientes métodos. Puedes llamar a tu instancia test-instance
para usarla con otros temas de este documento que hagan referencia a una instancia llamada test-instance
.
- Google Cloud CLI
- La Google Cloud consola
- Una biblioteca de cliente (C++, C#, Go, Java, Node.js, PHP, Python o Ruby)
Consultar los archivos de muestra
El repositorio de ejemplos contiene un ejemplo que muestra cómo usar Spanner con JDBC.
Elpom.xml
añade el controlador JDBC de Spanner a las dependencias del proyecto y configura el complemento de ensamblaje para crear un archivo JAR ejecutable con la clase Java definida en este tutorial.
Compila el ejemplo desde el directorio samples/snippets
:
mvn package -DskipTests
Crear una base de datos
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
Deberías ver lo siguiente:
Created database [projects/my-project/instances/test-instance/databases/example-db]
GoogleSQL
PostgreSQL
El siguiente paso consiste en escribir datos en la base de datos.
Crear una conexión JDBC
Para poder leer o escribir datos, debes crear unConnection
. Todas tus interacciones con Spanner deben realizarse a través de un Connection
. El nombre de la base de datos y otras propiedades se especifican en la URL de conexión JDBC y en el conjunto java.util.Properties
.
GoogleSQL
PostgreSQL
Para ver una lista completa de las propiedades admitidas, consulta Propiedades de URL de conexión.
Cada Connection
usa recursos, por lo que es recomendable cerrar las conexiones cuando ya no se necesiten o usar un grupo de conexiones para reutilizarlas en toda la aplicación.
Consulta más información en la Connection
referencia de Javadoc.
Conectar el controlador JDBC al emulador
Puedes conectar el controlador JDBC al emulador de Spanner de dos formas:
- Define la variable de entorno
SPANNER_EMULATOR_HOST
: de esta forma, se indica al controlador JDBC que se conecte al emulador. La instancia y la base de datos de Spanner de la URL de conexión JDBC ya deben existir en el emulador. - Añade
autoConfigEmulator=true
a la URL de conexión: de esta forma, se indica al controlador JDBC que se conecte al emulador y que cree automáticamente la instancia y la base de datos de Spanner en la URL de conexión JDBC si no existen.
En este ejemplo se muestra cómo usar la opción de URL de conexión autoConfigEmulator=true
.
GoogleSQL
PostgreSQL
Escribir datos con DML
Puedes insertar datos mediante el lenguaje de manipulación de datos (DML) en una transacción de lectura y escritura.
Utiliza el método PreparedStatement.executeUpdate()
para ejecutar una instrucción DML.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
Deberías ver lo siguiente:
4 records inserted.
Escribir datos con un lote de DML
Puedes usar los métodosPreparedStatement#addBatch()
y PreparedStatement#executeBatch()
para ejecutar varias instrucciones DML en un lote.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
Deberías ver lo siguiente:
3 records inserted.
Escribir datos con mutaciones
También puedes insertar datos mediante mutaciones.
Puedes escribir datos con un objeto Mutation
.
Un objeto Mutation
es un contenedor de operaciones de mutación. Una Mutation
representa una secuencia de inserciones, actualizaciones y eliminaciones que Spanner
aplica de forma atómica a diferentes filas y tablas de una base de datos de Spanner.
El método newInsertBuilder()
de la clase Mutation
crea una mutación INSERT
, que inserta una fila nueva en una tabla. Si ya existe la fila, no se puede escribir. También puedes usar el método newInsertOrUpdateBuilder
para crear una mutación INSERT_OR_UPDATE
, que actualiza los valores de las columnas
si la fila ya existe.
write()
de la interfaz CloudSpannerJdbcConnection
escribe las mutaciones. Todas las mutaciones de un mismo lote se aplican de forma atómica.
Puedes extraer la interfaz CloudSpannerJdbcConnection
de un Connection
de Spanner JDBC.
En este código se muestra cómo escribir los datos mediante mutaciones:
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
Deberías ver lo siguiente:
Inserted 10 rows.
Consultar datos mediante SQL
Spanner admite una interfaz SQL para leer datos, a la que puedes acceder en la línea de comandos mediante la CLI de Google Cloud o de forma programática mediante el controlador JDBC de Spanner.
En la línea de comandos
Ejecuta la siguiente instrucción SQL para leer los valores de todas las columnas de la tabla 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'
El resultado muestra lo siguiente:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Usar el controlador JDBC de Spanner
Además de ejecutar una instrucción SQL en la línea de comandos, puedes emitir la misma instrucción SQL de forma programática mediante el controlador JDBC de Spanner.
Los siguientes métodos y clases sirven para ejecutar la consulta SQL:- El método
createStatement()
de la interfazConnection
: úsalo para crear un objeto de instrucción para ejecutar una instrucción SQL. - El método
executeQuery(String)
de la claseStatement
: usa este método para ejecutar una consulta en una base de datos. - La clase
Statement
: úsala para ejecutar una cadena de SQL. - La clase
ResultSet
: úsala para acceder a los datos devueltos por una instrucción SQL.
A continuación, se indica cómo emitir la consulta y acceder a los datos:
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
El resultado debe ser el siguiente:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Consultar usando un parámetro de SQL
Si tu aplicación tiene una consulta que se ejecuta con frecuencia, puedes mejorar su rendimiento parametrizándola. La consulta paramétrica resultante se puede almacenar en caché y reutilizar, lo que reduce los costes de compilación. Para obtener más información, consulta Usar parámetros de consulta para acelerar las consultas que se ejecutan con frecuencia.
Aquí tienes un ejemplo de cómo usar un parámetro en la cláusula WHERE
para consultar registros que contengan un valor específico de LastName
.
Usa java.sql.PreparedStatement
para ejecutar una consulta con un parámetro.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
El resultado debe ser el siguiente:
12 Melissa Garcia
Actualizar el esquema de la base de datos
Supongamos que quiere añadir una nueva columna llamada MarketingBudget
a la tabla Albums
. Para agregar una nueva columna a una tabla existente, es preciso actualizar el esquema de base de datos. Spanner admite actualizaciones de esquemas en una base de datos mientras esta sigue atendiendo tráfico. Para actualizar el esquema, no es necesario desconectar la base de datos y no se bloquean tablas ni columnas completas. Puedes seguir escribiendo datos en la base de datos durante la actualización del esquema. Consulta más información sobre las actualizaciones de esquemas y el rendimiento de los cambios de esquemas admitidos en el artículo Hacer actualizaciones de esquemas.
Añadir una columna
Puedes añadir una columna en la línea de comandos mediante la CLI de Google Cloud o de forma programática mediante el controlador JDBC de Spanner.
En la línea de comandos
Usa el siguiente comando ALTER TABLE
para añadir la nueva columna a la tabla:
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'
Deberías ver lo siguiente:
Schema updating...done.
Usar el controlador JDBC de Spanner
Usa el métodoexecute(String)
de la clase java.sql.Statement
para modificar el esquema:
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
Deberías ver lo siguiente:
Added MarketingBudget column.
Ejecutar un lote de DDL
Se recomienda ejecutar varias modificaciones de esquema en un lote. Usa el método addBatch(String)
de java.sql.Statement
para añadir varias instrucciones DDL a un lote.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
Deberías ver lo siguiente:
Added Venues and Concerts tables.
Escribir datos en la nueva columna
El siguiente código sirve para escribir datos en la nueva columna. Define MarketingBudget
como 100000
en la fila con la clave Albums(1, 1)
y como 500000
en la fila con la clave Albums(2, 2)
.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
Debería ver un resultado similar a este:
Updated albums
También puedes ejecutar una consulta SQL o una llamada de lectura para recuperar los valores que acabas de escribir.
Aquí está el código para ejecutar la consulta:
GoogleSQL
PostgreSQL
Para ejecutar esta consulta, ejecuta el siguiente 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
El resultado muestra lo siguiente:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
Actualizar datos
Puedes actualizar datos mediante DML en una transacción de lectura y escritura.
Define AutoCommit=false
para ejecutar transacciones de lectura y escritura en JDBC.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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 transacción y de solicitud
Usa etiquetas de transacción y de solicitud
para solucionar problemas de transacciones y consultas en Spanner. Puede definir etiquetas de transacción y de solicitud en JDBC con las variables de sesión TRANSACTION_TAG
y STATEMENT_TAG
.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
Recuperar datos mediante transacciones de solo lectura
Supongamos que deseas ejecutar más de una lectura en la misma marca de tiempo. En las transacciones de solo lectura se observa un prefijo uniforme del historial de confirmación de transacción, por lo que la aplicación siempre obtiene datos uniformes.
Define ReadOnly=true
y AutoCommit=false
en un java.sql.Connection
o usa la instrucción SQL SET TRANSACTION READ ONLY
para ejecutar una transacción de solo lectura.
A continuación, se muestra cómo ejecutar una consulta y realizar una lectura en la misma transacción de solo lectura:
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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
El resultado que verás debe parecerse al siguiente:
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 con particiones y Acelerador de datos
La API partitionQuery
divide una consulta en partes más pequeñas, o particiones, y usa varias
máquinas para obtener las particiones en paralelo. Cada partición se identifica mediante un token de partición. La API PartitionQuery tiene una latencia mayor que la API de consulta estándar, ya que solo está diseñada para operaciones en bloque, como exportar o analizar toda la base de datos.
Data Boost te permite ejecutar consultas analíticas y exportaciones de datos con un impacto casi nulo en las cargas de trabajo de la instancia de Spanner aprovisionada. Data Boost solo admite consultas particionadas.
GoogleSQL
PostgreSQL
Ejecuta la muestra con 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 obtener más información sobre cómo ejecutar consultas con particiones y usar Data Boost con el controlador JDBC, consulta los siguientes artículos:
- GoogleSQL: Data Boost y sentencias de consulta particionadas
- PostgreSQL: Data Boost y sentencias de consulta particionadas
DML particionado
El lenguaje de manipulación de datos (DML) particionado se ha diseñado para los siguientes tipos de actualizaciones y eliminaciones en bloque:
- Limpieza periódica y recolección de elementos no utilizados.
- Rellenar las nuevas columnas con valores predeterminados.
PostgreSQL
Ejecuta la muestra con 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 obtener más información sobre AUTOCOMMIT_DML_MODE
, consulta:
Limpieza
Para evitar que se apliquen cargos adicionales en tu cuenta de Facturación de Cloud por los recursos utilizados en este tutorial, elimina la base de datos y la instancia que has creado.
Eliminar la base de datos
Al eliminar una instancia, se eliminan automáticamente todas sus bases de datos. En este paso se muestra cómo eliminar una base de datos sin eliminar una instancia (se seguirían generando costes por la instancia).
En la línea de comandos
gcloud spanner databases delete example-db --instance=test-instance
Usar la Google Cloud consola
Ve a la página Instancias de Spanner de la Google Cloud consola.
Haz clic en la instancia.
Haz clic en la base de datos que quieras eliminar.
En la página sobre detalles de la base de datos, haz clic en Eliminar.
Confirma que deseas eliminar la base de datos y haz clic en Eliminar.
Eliminar la instancia
Al eliminar una instancia, se borran todas las bases de datos creadas en dicha instancia.
En la línea de comandos
gcloud spanner instances delete test-instance
Usar la Google Cloud consola
Ve a la página Instancias de Spanner de la Google Cloud consola.
Haz clic en tu instancia.
Haz clic en Eliminar.
Confirma que deseas eliminar la instancia y haz clic en Eliminar.
Siguientes pasos
- Consulta cómo integrar Spanner con Spring Data JPA (dialecto de GoogleSQL).
- Consulta cómo integrar Spanner con Spring Data JPA (dialecto de PostgreSQL).
- Consulta cómo integrar Spanner con Hibernate ORM (dialecto de GoogleSQL).
- Consulta cómo integrar Spanner con Hibernate ORM (dialecto de PostgreSQL).
- Consulta más información sobre los comandos de gestión de sesiones de JDBC (GoogleSQL).
- Consulta más información sobre los comandos de gestión de sesiones de JDBC (PostgreSQL).
Consulta cómo acceder a Spanner con una instancia de máquina virtual.
Consulta información sobre las credenciales de autorización y autenticación en el artículo Autenticarse en servicios de Cloud mediante bibliotecas de cliente.
Consulta más información sobre las prácticas recomendadas para el diseño de esquemas de Spanner.