Use o Tablestore SDK for Java para gravar, atualizar e excluir linhas em lote em uma ou mais tabelas do modelo Wide Column em uma única solicitação.
Pré-requisitos
Instale o Tablestore SDK for Java e inicialize o cliente.
Descrição
Chame batchWriteRow para combinar operações de gravação, atualização e exclusão de linhas em várias tabelas em uma única solicitação. O servidor processa cada linha independentemente. A falha em uma linha não afeta as demais. Chame isAllSucceed e getFailedRows para inspecionar os resultados.
public BatchWriteRowResponse batchWriteRow(BatchWriteRowRequest batchWriteRowRequest) throws TableStoreException, ClientException
Se qualquer operação na solicitação contiver um erro de parâmetro, o Tablestore retornará um erro de parâmetro para toda a solicitação e nenhuma operação será executada.
O exemplo a seguir grava uma linha (chave primária row1) na tabela batch_write_demo, verifica o resultado geral com isAllSucceed e recupera os detalhes das linhas com falha usando getFailedRows.
String tableName = "batch_write_demo";
BatchWriteRowRequest request = new BatchWriteRowRequest();
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowPutChange rowPutChange = new RowPutChange(tableName, primaryKey);
rowPutChange.addColumn("col1", ColumnValue.fromString("val1"));
request.addRowChange(rowPutChange);
BatchWriteRowResponse response = client.batchWriteRow(request);
System.out.println("All Succeeded: " + response.isAllSucceed());
if (!response.isAllSucceed()) {
for (BatchWriteRowResponse.RowResult fail : response.getFailedRows()) {
System.out.println("Failed: table=" + fail.getTableName()
+ " index=" + fail.getIndex()
+ " error=" + fail.getError());
}
}
Parâmetros
BatchWriteRowRequest contém os seguintes parâmetros.
|
Nome |
Tipo |
Descrição |
|
rowChangesGroupByTable (obrigatório) |
|
Operações de linha agrupadas por tabela, adicionadas ao chamar |
|
atomic (opcional) |
|
Define se as gravações atômicas em lote devem ser ativadas. Quando ativado, as operações de linha na mesma tabela precisam usar a mesma chave primária. Caso contrário, a solicitação falhará. |
|
transactionId (opcional) |
|
ID da transação local. Defina este parâmetro apenas ao operar dados em uma transação local. Se definido, uma única solicitação poderá conter operações para apenas uma tabela. Para obter informações sobre como adquirir e utilizar o ID, consulte Use local transactions. |
Operações de linha
Cada elemento em rowChangesGroupByTable é uma implementação de RowChange. As implementações a seguir são compatíveis.
RowPutChange: Grava colunas de atributo em uma linha. Para detalhes de configuração, consulte Write a row.RowUpdateChange: Adiciona, modifica ou exclui colunas de atributo em uma linha, ou executa incrementos atômicos. Para detalhes de configuração, consulte Atualize uma linha.RowDeleteChange: Exclua uma linha e todos os dados de suas colunas de atributo. Para detalhes de configuração, consulte Exclua uma linha.
Resposta
BatchWriteRowResponse contém o seguinte campo específico da operação.
|
Campo |
Tipo |
Descrição |
|
|
|
Resultados no nível de linha agrupados por tabela, obtidos ao chamar |
Resultado da linha
Cada elemento em tableToRowStatus é do tipo RowResult e contém os seguintes campos.
|
Campo |
Tipo |
Descrição |
|
|
|
Indica se a operação na linha foi bem-sucedida. |
|
|
|
Nome da tabela. |
|
|
|
Informações de erro retornadas quando a operação na linha falha. |
|
|
|
Posição da operação de linha na lista de operações da tabela. |
|
|
|
Dados da linha retornados pela operação. Se nenhum conteúdo de retorno estiver configurado, o valor será |
Exemplos
Atualização de linhas em lote
Use RowUpdateChange para atualizar colunas de atributo em uma solicitação em lote.
String tableName = "batch_write_demo";
BatchWriteRowRequest request = new BatchWriteRowRequest();
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row_for_update"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange(tableName, primaryKey);
// Update or add attribute columns
rowUpdateChange.put("col1", ColumnValue.fromString("new_val1"));
rowUpdateChange.put("col2", ColumnValue.fromLong(100));
// Delete an entire attribute column
rowUpdateChange.deleteColumns("obsolete_col");
request.addRowChange(rowUpdateChange);
client.batchWriteRow(request);
Exclusão de linhas em lote
Use RowDeleteChange para excluir linhas inteiras em uma solicitação em lote.
String tableName = "batch_write_demo";
BatchWriteRowRequest request = new BatchWriteRowRequest();
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row_for_delete"))
.build();
RowDeleteChange rowDeleteChange = new RowDeleteChange(tableName, primaryKey);
request.addRowChange(rowDeleteChange);
client.batchWriteRow(request);
Combinação de operações entre tabelas
Combine operações de gravação, atualização e exclusão em várias tabelas em uma única solicitação. O Tablestore retorna resultados por linha.
String tableA = "batch_write_demo";
String tableB = "batch_write_demo_2";
BatchWriteRowRequest request = new BatchWriteRowRequest();
// Insert a new row into table A
PrimaryKey pkA = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("rowA_new"))
.build();
RowPutChange putA = new RowPutChange(tableA, pkA);
putA.addColumn("col1", ColumnValue.fromString("valA"));
request.addRowChange(putA);
// Update an existing row in table B
PrimaryKey pkB = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("rowB_existing"))
.build();
RowUpdateChange updateB = new RowUpdateChange(tableB, pkB);
updateB.put("status", ColumnValue.fromString("done"));
request.addRowChange(updateB);
// Delete a row from table A
PrimaryKey pkADel = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("rowA_obsolete"))
.build();
RowDeleteChange deleteA = new RowDeleteChange(tableA, pkADel);
request.addRowChange(deleteA);
BatchWriteRowResponse response = client.batchWriteRow(request);
if (!response.isAllSucceed()) {
System.out.println("Failed rows: " + response.getFailedRows().size());
for (BatchWriteRowResponse.RowResult fail : response.getFailedRows()) {
System.out.println(" - table=" + fail.getTableName()
+ " index=" + fail.getIndex()
+ " error=" + fail.getError().getMessage());
}
}