我想通过控制台将自动数字添加到dynamodb中表的关键字段, 例如0,1,2,...
我有contact_us
表,我希望列有自动ID增量。
请帮帮我。
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
public class ContactUs extends HttpServlet {
String con_id;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
// ...
// ...
Map<String, AttributeValue> item = newRecord();
//System.out.println(item);
// ...
dbObject.addRecord(item, "contact_us");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private Map<String, AttributeValue> newRecord() {
Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
con_id = getConID();
dateTimeTimestamp = new SysDateTimeTimestamp();
//Need to add con_id which will be auto id.
item.put("con_id", new AttributeValue(con_id));
// ...
// ...
return item;
}
@DynamoDBHashKey(attributeName = "con_id")
@DynamoDBAutoGeneratedKey
public String getConID(){
return con_id;
}
public void setConID(String con_id){
this.con_id = con_id;
}
}
这里我收到空白的con_id值。
答案 0 :(得分:4)
请参阅此link。根据DynamoDB中的最佳实践,不建议使用以1为增量的整数来生成表的哈希键。为了使表能够根据预配容量进行扩展,请求应在密钥空间内均匀分布。
推荐的方法是使用 UUID 。如果您使用的是AWS Java SDK,则可以使用 android:launchMode="singleTop"
自动生成哈希密钥。散列键应定义为字符串。该密钥将作为标准UUID格式生成,这将有助于在密钥空间中扩展和传播数据。
使用@DynamoDBAutoGeneratedKey的示例类: -
@DynamoDBAutoGeneratedKey
创建订单方法: -
import java.io.Serializable;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName = "Order")
public class Order implements Serializable {
private static final long serialVersionUID = -3534650012619938612L;
private String orderId;
private String productName;
@DynamoDBHashKey(attributeName = "orderId")
@DynamoDBAutoGeneratedKey
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
@DynamoDBAttribute(attributeName = "productName")
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
}
我使用Spring配置了public Boolean createOrder(String productName) {
DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDBClient);
Order order = new Order();
order.setProductName(productName);
dynamoDBMapper.save(order);
return true;
}
。
dynamoDBClient
此代码已成功测试。如果你正确配置了dynamoDBClient,它应该可以工作。
答案 1 :(得分:0)
您也许可以使用AtomicCounters
这是 AtomicCounter
上官方文档的引文您可以使用UpdateItem操作来实现 原子计数器-递增的数字属性, 无条件地,而不会干扰其他写入请求。 (所有 写入请求将按照接收到的顺序进行应用。) 使用原子计数器,更新不是幂等的。其他 字,每次调用UpdateItem时数值都会递增。
您可以使用原子计数器来追踪访问者的数量 网站。在这种情况下,您的应用程序将增加一个数字 值,而不考虑其当前值。如果是UpdateItem操作 失败,应用程序可以简单地重试该操作。这个会 会有两次更新计数器的风险,但您可能可以忍受 网站访问者人数略有增加或减少。
话虽如此,推荐的方法是使用UUID而不是自动递增的Integer,因为您可能会限制自己的性能