2017-03-20 84 views
2

我正在使用DynamoDBMapper將項目保存到沒有任何條件/表達式設置的DynamoDB中。但每次保存對象時都會收到ConditionalCheckFailed異常。參考下面的代碼。使用java將項目存儲到DynamoDB時發生ConditionalCheck發生異常

注意:我正在5線程下運行此代碼。

Main.java

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; 
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; 
import com.amazonaws.regions.Region; 

AmazonDynamoDBClient db = new AmazonDynamoDBClient(); 
Region region = Region.getRegion(regions); 
db.setRegion(region); 
DynamoDBMapperConfig config = new DynamoDBMapperConfig(DynamoDBMapperConfig.DEFAULT, 
      new DynamoDBMapperConfig(TableNameOverride.withTableNameReplacement("myTableName"))); 
DynamoDBMapper mapper = new DynamoDBMapper(db, config); 

UserDocument userDocument = new UserDocument("UD001", "TestUser"); 
mapper.save(userDocument); # Getting ConditionalCheckFailed exception 

UserDocument.java

public class UserDocument { 
    public UserDocument(String id, String account) { 
     this.id = id; 
     this.account = account; 
    } 

    @DynamoDBHashKey 
    @DynamoDBAttribute(attributeName = "id") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @DynamoDBVersionAttribute 
    public Long getVersion() { 
     return version; 
    } 

    public void setVersion(Long version) { 
     this.version = version; 
    } 

    @DynamoDBAttribute(attributeName = "account") 
    public int getAccount() { 
     return account; 
    } 

    public void setAccount(int account) { 
     this.account = account; 
    } 
} 
+0

您可以顯示TestClass中碼和值要分配到該對象? – notionquest

+0

嗨,添加了我的測試類「UserDocument」和分配給它的值。 – Inaccessible

回答

2

DynamoDB使樂觀鎖定的策略,以確保您更新(或刪除)客戶端產品一樣的DynamoDB中的項目。註釋@DynamoDBVersionAttribute用於此。

第一次 - 保存應工作順利

第二次 - 您需要提供的版本,同時調用保存。例如: -

userDocument.setVersion(1L); 

@DynamoDBVersionAttribute

爲了支持樂觀鎖時,AWS SDK for Java提供了 @DynamoDBVersionAttribute註解。在 表的映射類中,您指定一個屬性來存儲版本號, 使用此註釋標記它。保存對象時,DynamoDB表中的對應項目 將具有 存儲版本號的屬性。

要關閉樂觀鎖: -

設置SaveBehavior爲CLOBBER

DynamoDBMapperConfig config = new DynamoDBMapperConfig(new DynamoDBMapperConfig(
       DynamoDBMapperConfig.SaveBehavior.CLOBBER),    
       new DynamoDBMapperConfig(TableNameOverride.withTableNameReplacement("userdocument"))); 

要禁用樂觀鎖,你可以改變 DynamoDBMapperConfig.SaveBehavior枚舉值從更新到 CLOBBER。您可以通過創建DynamoDBMapperConfig實例 來完成此操作,該實例將跳過版本檢查,並將此實例用於所有請求中的 。

Optimistic locking

相關問題