Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWS DynamoDB Java BatchWriteItem连接重置错误_Java_Amazon Web Services_Amazon Dynamodb - Fatal编程技术网

AWS DynamoDB Java BatchWriteItem连接重置错误

AWS DynamoDB Java BatchWriteItem连接重置错误,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,在尝试运行以下程序时捕获了上述异常 BatchWriteItemResult; BatchWriteItemRequest BatchWriteItemRequest=新的BatchWriteItemRequest(); 做{ System.out.println(“提出请求”); batchWriteItemRequest.withRequestItems(requestItems); 结果=client.batchWriteItem(batchWriteItemRequest); //打印消

在尝试运行以下程序时捕获了上述异常

BatchWriteItemResult;
BatchWriteItemRequest BatchWriteItemRequest=新的BatchWriteItemRequest();
做{
System.out.println(“提出请求”);
batchWriteItemRequest.withRequestItems(requestItems);
结果=client.batchWriteItem(batchWriteItemRequest);
//打印消耗的容量单位
对于(Map.Entry:result.getResponses().entrySet()){
String tableName=entry.getKey();
Double consumedCapacityUnits=entry.getValue().getConsumedCapacityUnits();
System.out.println(“表“+tableName+”:“+consumedCapacityUnits的消耗容量单位”);
}
//检查未处理的密钥,如果您的吞吐量超过配置的吞吐量,可能会发生这种情况
System.out.println(“未处理的Put和Delete请求:\n”+result.getUnprocessedItems());
requestItems=result.getUnprocessedItems();
}while(result.getUnprocessedItems().size()>0);
我设置了1个表,配置了8个写入单元

在我的
BatchWriteItemRequest
中,我有9个
PutRequestItems

当第一次在while循环中时,9个PutRequestItems中的8个被处理。 因此,再次进入循环,试图处理剩余的一个请求

然而,代码将挂起在
result=client.batchWriteItem(batchWriteItemRequest)约149秒。然后,抛出上述异常


似乎绕过此问题的唯一方法是设置更高的写资源调配单元。然而,while do循环不是一种处理超出已设置写入单元的情况的方法吗?

有一个AWS SDK for Java版本打破了您描述的重试行为。基本上,请求的输入流在两次尝试之间没有重置,因此每次重试都会立即失败。默认情况下,DynamoDB使用指数退避进行10次重试,导致您看到的非常长的延迟。更新SDK以解决此问题:


这似乎是Java驱动程序v上的一个bug。1.3.21(或可能包括旧版本)

发布1.3.21.1只是为了解决以下问题:

解决的问题

请求重试期间的SocketException

修复了由服务错误响应(即。 非IO错误重试)无法正确重新发送请求 使用请求的Amazon DynamoDB等服务的有效负载 有效载荷


请参见您试图存储的9个项目有多大?您是否检查过运行请求的地方没有中断?每个字段都有9个字段,最大的字段是一个少于100个字符的字符串字段。我不相信有中断,因为1,前8/9项很快就写入了数据库;2,当我从Dynamo管理控制台将我的写入单元翻转到9时,所有9项都已写入。谢谢。然而,我们在几周前已经改用MongoDB了。我很乐意使用新的SDK进行测试,并将结果发布在这里。
com.amazonaws.AmazonClientException: Unable to execute HTTP request: Connection reset
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:324)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:164)
    at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:985)
    at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.batchWriteItem(AmazonDynamoDBClient.java:365)
    .
    .
    .
BatchWriteItemResult result;
BatchWriteItemRequest batchWriteItemRequest = new BatchWriteItemRequest();
do {
    System.out.println("Making the request.");                         
    batchWriteItemRequest.withRequestItems(requestItems);
    result = client.batchWriteItem(batchWriteItemRequest);

    // Print consumed capacity units
    for(Map.Entry<String, BatchWriteResponse> entry : result.getResponses().entrySet()) {
        String tableName = entry.getKey();
        Double consumedCapacityUnits = entry.getValue().getConsumedCapacityUnits();
        System.out.println("Consumed capacity units for table " + tableName + ": " + consumedCapacityUnits);
     }

  // Check for unprocessed keys which could happen if you exceed provisioned throughput
    System.out.println("Unprocessed Put and Delete requests: \n" + result.getUnprocessedItems());
    requestItems = result.getUnprocessedItems();
} while (result.getUnprocessedItems().size() > 0);