2012-10-22 109 views
2
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) 
    . 
    . 
    . 

上面的异常在尝试运行以下code sample时被捕获。AWS DynamoDB Java BatchWriteItem连接重置错误

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); 

我有1个表设置了8个写入单元配置。

在我的BatchWriteItemRequest我有9 PutRequestItems

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

但是,代码会在 result = client.batchWriteItem(batchWriteItemRequest);处挂起大约149秒。之后,抛出上述异常。

似乎绕过这个的唯一方法是设置一个更高的写入提供单元。但是,是不是通过while-do循环来处理超出我们配置的写入单元的情况?

+0

有多大你试图存储9个项目?您是否检查过您的请求没有中断? – yadutaf

+0

他们每个人都有9个字段,最大的字段是一个String字段,大约少于100个字符。 – ethangui

+0

我不相信有中断,因为1,第一个8/9项是很快写入db的; 2,当我从Dynamo管理控制台将我的写入单元超过9个时,所有9个项目都被写入。 – ethangui

回答

0

这似乎是对Java驱动器V的错误1.3.21(或者包括旧版本)。

1.3.21.1发布只是采取照顾:

解决的问题

SocketException在请求重试

纠正了造成服务的错误响应重试(即 不是问题IO错误重试)无法正确地重新发送使用请求 有效负载的服务(如Amazon DynamoDB)的有效负载 。

看到http://aws.amazon.com/releasenotes/Java/5659251433242996

0

有一个适用于Java的AWS SDK版本,它以您描述的方式打破了重试行为。基本上,请求的输入流在尝试之间没有得到重置,所以每次重试都会立即失败。 DynamoDB在默认情况下会执行10次指数退避,导致您看到很长的延迟。更新您的SDK来解决这个问题:

http://aws.amazon.com/sdkforjava/

+0

谢谢。不过,我们几个星期前已经开始使用MongoDB了。我很乐意用新的SDK进行测试,并在此发布我的结果。 – ethangui