Amazon dynamodb Dynamodb条件检查失败异常属性\u不存在\u或上次\u状态\u修改\u时间<;:瓦尔
我们使用此代码来操作dynamodb:Amazon dynamodb Dynamodb条件检查失败异常属性\u不存在\u或上次\u状态\u修改\u时间<;:瓦尔,amazon-dynamodb,conditional-operator,Amazon Dynamodb,Conditional Operator,我们使用此代码来操作dynamodb: 如果user\u id不存在,代码将向dynamodb插入一条记录 如果user\u id确实存在并且modify\u time字段(在项目中)
- 如果
不存在,代码将向dynamodb插入一条记录user\u id
- 如果
确实存在并且user\u id
字段(在项目中)<modify\u time
(在我的代码中),它将更新此项目的last\u status\u modify\u time
modify\u time
条件请求失败(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ConditionalCheckFailedException
。只想知道我的条件表达式是否有问题?
这是我们的代码
private static void saveRoomStatusToDynamoDB(CacheClient client, ZRRoomItem item) {
if (item == null) {
return;
}
try {
logger.debug("begin saveRoomStatusToDynamoDB, item: {}", item);
String condition = String.format(
"attribute_not_exists(%s) or %s < :val",
DynamoConstants.FIELD_ZR_ROOM_ITEM_USER_ID,
DynamoConstants.FIELD_ZR_ROOM_ITEM_LAST_STATUS_MODIFY_TIME);
Map<String, Object> valueMap = new HashMap<>();
valueMap.put(":val", item.getLastStatusModifyTime());
//l_putItem will call dynamodb api
boolean result = DynamoDBUtil.getInstance().l_putItem(
DynamoConstants.TABLE_ZR_ROOM_ITEM, item.toDynamoItem(),
condition, valueMap);
} catch (Exception e) {
logger.error("saveRoomStatusToDynamoDB error, item: {}, {}",
item,
WebLogger.printStackTrace(e));
}
}
private static void saveRoomStatusToDynamoDB(CacheClient-client,ZRRoomItem项){
如果(项==null){
返回;
}
试一试{
debug(“begin saveRoomStatusToDynamoDB,item:{}”,item);
字符串条件=String.format(
“属性不存在(%s)或%s<:val”,
DynamoConstants.FIELD\u ZR\u ROOM\u ITEM\u USER\u ID,
动态恒量。字段(ZR、房间、项目、上次状态、修改时间);
Map valueMap=新的HashMap();
valueMap.put(“:val”,item.getLastStatusModifyTime());
//l_putItem将调用dynamodb api
布尔结果=DynamoDBUtil.getInstance().l_putItem(
DynamoConstants.TABLE_ZR_ROOM_ITEM,ITEM.toDynamoItem(),
条件、价值图);
}捕获(例外e){
error(“saveRoomStatusToDynamoDB错误,项:{},{}”,
项目,,
printStackTrace(e));
}
}
如果尝试使用条件执行putItem()
,且条件的计算结果为false,则不会执行更新,并引发异常(ConditionalCheckFailedException
)
根据您的问题,我相信您预期当条件的计算结果为false时,putItem()
调用将正常返回。实际上并非如此:它会抛出您得到的异常。因此,您只需要捕获异常并从方法返回
进一步的细节:我的意思是有时我的代码抛出ConditionalCheckFailedException,但数据仍然可以保存或更新到db。这很奇怪。理论上,如果有异常,putItem()不会将数据保存到数据库中。所以我想知道我的条件表达式是否错误。@AnhuaZhao-您如何确定数据可以保存?您能给出这种情况的示例(数据库中的数据,您要更新的数据)吗?