単一行の挿入
PutRow は、システム生成のバージョン番号、カスタムバージョン番号、および条件付き書き込みをサポートしています。
システム生成のバージョン番号
10 個の属性列を持つ行を挿入します。各列には 1 つのバージョンのデータが格納されます。バージョン番号はシステムによって自動的に生成されます。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名を指定
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 属性列を追加
for (int i = 0; i < 10; i++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
client.putRow(new PutRowRequest(rowPutChange));
}
カスタムバージョン番号
10 個の属性列を持つ行を挿入します。各列にはカスタムバージョン番号を持つ 3 つのバージョンのデータが格納されます。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名を指定
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 属性列を追加
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
行の存在条件
指定された行が存在しない場合にのみ、10 個の属性列 (各 3 バージョン) を持つ行を挿入します。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名を指定
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 行が存在しないことを期待する、行の存在条件を指定
rowPutChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
// 属性列を追加
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
行の存在条件と列の値の条件
行が存在し、Col0 の値が 100 より大きい場合に、10 個の属性列 (各 3 バージョン) を持つ行を挿入します。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名を指定
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 行が存在し、かつCol0列の値が100より大きいことを期待する、行の存在条件と列条件を指定
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
condition.setColumnCondition(new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
rowPutChange.setCondition(condition);
// 属性列を追加
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
単一行の更新
UpdateRow は、無条件更新と、行の存在および列の値に基づく条件付き更新をサポートしています。
無条件更新
複数の列を更新し、列から特定のバージョンのデータを削除し、列を削除します。
private static void updateRow(SyncClient client, String pkValue) {
// プライマリキーを構築
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名を指定
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
// 列を更新
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列から特定のバージョンのデータを削除
rowUpdateChange.deleteColumn("Col10", 1465373223000L);
// 列を削除
rowUpdateChange.deleteColumns("Col11");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}
行の存在条件と列の値の条件
行が存在し、Col0 の値が 100 より大きい場合に、行を更新します。
private static void updateRow(SyncClient client, String pkValue) {
// プライマリキーを構築
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名を指定
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
// 行が存在し、かつCol0列の値が100より大きいことを期待する、行の存在条件と列条件を指定
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
condition.setColumnCondition(new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
rowUpdateChange.setCondition(condition);
// 列を更新
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列から特定のバージョンのデータを削除
rowUpdateChange.deleteColumn("Col10", 1465373223000L);
// 列を削除
rowUpdateChange.deleteColumns("Col11");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}
複数行の同時書き込み
次の例では、2 つの PutRow オペレーション、1 つの UpdateRow オペレーション、および 1 つの DeleteRow オペレーションを含む BatchWriteRow リクエストを送信します。
private static void batchWriteRow(SyncClient client) {
BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
// rowPutChange1 を構築
PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk1Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk1"));
// データテーブル名を指定
RowPutChange rowPutChange1 = new RowPutChange("<TABLE_NAME>", pk1Builder.build());
// 列を追加
for (int i = 0; i < 10; i++) {
rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// バッチオペレーションに rowPutChange1 を追加
batchWriteRowRequest.addRowChange(rowPutChange1);
// rowPutChange2 を構築
PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk2Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk2"));
// データテーブル名を指定
RowPutChange rowPutChange2 = new RowPutChange("<TABLE_NAME>", pk2Builder.build());
// 列を追加
for (int i = 0; i < 10; i++) {
rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// バッチオペレーションに rowPutChange2 を追加
batchWriteRowRequest.addRowChange(rowPutChange2);
// rowUpdateChange を構築
PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk3Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk3"));
// データテーブル名を指定
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", pk3Builder.build());
// 列を追加
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列を削除
rowUpdateChange.deleteColumns("Col10");
// バッチオペレーションに rowUpdateChange を追加
batchWriteRowRequest.addRowChange(rowUpdateChange);
// rowDeleteChange を構築
PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk4Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk4"));
// データテーブル名を指定
RowDeleteChange rowDeleteChange = new RowDeleteChange("<TABLE_NAME>", pk4Builder.build());
// バッチオペレーションに rowDeleteChange を追加
batchWriteRowRequest.addRowChange(rowDeleteChange);
BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
System.out.println("すべてのオペレーションが成功したか: " + response.isAllSucceed());
if (!response.isAllSucceed()) {
for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
System.out.println("失敗した行: " + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
System.out.println("失敗の原因: " + rowResult.getError());
}
/**
* createRequestForRetryメソッドを使用すると、失敗した行のオペレーションを再試行するためのリクエストを再構築できます。このコードではリクエストの構築のみを行います。
* 再試行方法として、Tablestore SDKのカスタム再試行ポリシーの使用を推奨します。この機能により、バッチオペレーションで失敗した行を自動で再試行できます。
* 再試行ポリシーを設定した場合、このような再試行コードを記述する必要はありません。
*/
BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
}
}