dynamodb:如何在向表

时间:2016-10-01 15:25:03

标签: java amazon-dynamodb

我想通过控制台将自动数字添加到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值。

2 个答案:

答案 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,因为您可能会限制自己的性能