aws dynamodb_使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

aws dynamodb

将任何实体上的版本属性保存到
AWS DynamoDB数据库,它只是表示已修改实体次数的数字表示。 首次创建实体时,可以将其设置为1,然后在每次更新时递增。

好处是立竿见影的-指示实体已被修改的次数,可用于审核实体。 此外,还有一种额外的用途是乐观锁定 ,其中仅当更新实体的持有人具有正确版本的实体时才允许更新实体。

这篇文章将详细介绍如何通过AWS开发工具包2的DynamoDB相关库引入此类字段

模型

考虑一个称为酒店的模型,该模型将持久化到发电机数据库中。 在Kotlin中,可以使用以下数据类表示它:

 data class Hotel( val id: String = UUID.randomUUID().toString(), val name: String, val address: String? = val address: String? = null , val state: String? = val state: String? = null , val zip: String? = val zip: String? = null , val version: Long = 1L  ) 

此模型中引入了一个version字段,其初始值为1。其目的是按原样保存此字段,然后让dynamo在保存该实体时自动管理该字段的增量。

随着此模型中字段的更改,我希望按照以下内容更新版本:

DynamoDB的本地版本

使DynamoDB在本地计算机上运行非常有用,这样就不必在AWS中创建真正的DynamoDB表。

有多种方法可以做到这一点。 一种是使用的docker版本
DynamoDB Local ,可以通过以下方式启动以侦听端口4569:

 amazon/dynamodb-local: docker run -p 4569 : 8000 amazon/dynamodb-local: 1.13 

我个人的喜好是使用localstack ,该站点上的说明有不同的启动方式。 我通常使用docker-compose来启动它。 在DynamoDB Local上使用localstack的原因之一是localstack提供了一套全面的AWS服务用于本地测试,而不仅仅是DynamoDB。

快速演示

我在这里的 github仓库中有完整的代码–
https://github.com/bijukunjummen/boot-with-dynamodb

使用dynamoDB的本地版本启动应用程序后,可以使用以下httpie请求创建实体:

 http : 9080 /hotels id= 4 name=name address=address zip=zip state=OR 

响应,其中version字段设置为1:

 { "address" : "address" , "id" : "4" , "name" : "name" , "state" : "OR" , "version" : 1 , "zip" : "zip"  } 

然后,如果实体的名称已更新:

 http PUT : 9080 /hotels/ 4 name=name1 address=address zip=zip state=OR version= 1 

版本字段将更新为2,依此类推:

 { "address" : "address" , "id" : "4" , "name" : "name1" , "state" : "OR" , "version" : 2 , "zip" : "zip"  } 

另请注意,如果在更新期间提供了错误的版本号,则调用将失败,因为使用此版本字段存在乐观锁定。

实施版本字段

实现版本字段取决于DynamoDB提供的功能强大的UpdateItem API。 UpdateItem API的功能之一是它包含一个“ UpdateExpression”,它是一个dsl,它显示了应如何更新不同的Dynamo属性。

对AWS DynamoDB的原始请求如下所示:

 { "TableName" : "hotels" , "Key" : { "id" : { "S" : "1" } }, "UpdateExpression" : "\nSET #name=:name,\n #state=:state,\naddress=:address,\nzip=:zip\nADD version :inc\n " , "ExpressionAttributeNames" : { "#state" : "state" , "#name" : "name" }, "ExpressionAttributeValues" : { ":name" : { "S" : "testhotel" }, ":address" : { "S" : "testaddress" }, ":state" : { "S" : "OR" }, ":zip" : { "S" : "zip" }, ":inc" : { "N" : "1" } }  } 

从文章角度看,特别关注“ ADD版本:inc”,该表达式告诉AWS DynamoDB使用“:inc”值将版本的值增加,该值使用“ ExpressionAttributeValues”和“ 1”单独提供。 以json格式处理原始API令人生畏,这是AWS提供的软件开发工具包(SDK)出现的地方,适用于Java 2的AWS开发工具包是对AWS开发工具包的重写,其重点是使用最新的Java功能和非通过线路阻塞IO。 使用适用于Java 2的AWS开发工具包,“ UpdateItem”如下所示(使用Kotlin代码):

 val updateItemRequest = UpdateItemRequest.builder() .tableName(TABLE_NAME) .key( mapOf( ID to AttributeValue.builder().s(hotel.id).build() ) ) .updateExpression( "" " SET #name=:name, #state=:state, address=:address, zip=:zip ADD version :inc "" " ) .conditionExpression( "version = :version" ) .expressionAttributeValues( mapOf( ":${NAME}" to AttributeValue.builder().s(hotel.name).build(), ":${ZIP}" to AttributeValue.builder().s(hotel.zip).build(), ":${STATE}" to AttributeValue.builder().s(hotel.state).build(), ":${ADDRESS}" to AttributeValue.builder().s(hotel.address).build(), ":${VERSION}" to AttributeValue.builder().n(hotel.version.toString()).build(), ":inc" to AttributeValue.builder().n( "1" ).build() ) ) .expressionAttributeNames( mapOf( "#name" to "name" , "#state" to "state" ) ) .build()  val updateItem: CompletableFuture<UpdateItemResponse> = dynamoClient.updateItem(updateItemRequest)  return Mono.fromCompletionStage(updateItem) .flatMap { getHotel(hotel.id) } 

高亮显示的行具有“ Update Expression”,其中所有现有字段均设置为新值,并且version属性增加了1。关于此调用的另一件事要注意的是“ conditionExpression”,这实际上是告诉DynamoDB更新的一种方式。如果条件匹配,则为属性;在此特定情况下,如果版本的现有值匹配,则为属性。 这提供了一种支持乐观锁定记录的巧妙方法。

结论

这里有很多细节–感受它的最简单方法是尝试在我的github存储库中找到的代码– https://github.com/bijukunjummen/boot-with-dynamodb 。 自述文件提供了有关如何在本地环境中运行它的详细信息。

AWS DynamoDB提供了一种巧妙的方法来管理实体上的版本字段,确保对它们进行原子更新,并为它们提供了一种用于乐观锁定的方法

翻译自: https://www.javacodegeeks.com/2020/05/aws-dynamodb-version-field-using-aws-sdk-for-java-2.html

aws dynamodb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地方法(JNI)——调用 java 方法

【0】README 1&#xff09; 本文部分文字描述 转自 core java volume 2 &#xff0c; 旨在理解 本地方法&#xff08;JNI&#xff09;——调用 java 方法 的基础知识 &#xff1b; 2&#xff09; C语言调用java 方法&#xff0c;包括&#xff1a; 静态C 方法 和 非静态C 方法…

Shell入门(二)之变量

一、shell变量类型 shell变量一般只有两种类型&#xff1a;数值型与字符串型。 运行shell时&#xff0c;会同时存在三种变量&#xff1a; 1) 局部变量 局部变量在脚本或命令中定义&#xff0c;仅在当前shell实例中有效&#xff0c;其他shell启动的程序不能访问局部变量。 …

aws部署ssh_将Quarkus应用程序部署到AWS Elastic Beanstalk

aws部署sshElastic Beanstalk允许在AWS云中部署和管理应用程序&#xff0c;而无需了解运行这些应用程序的基础架构。 使用Elastic Beanstalk&#xff0c;您可以运行可处理HTTP请求的网站&#xff0c;Web应用程序或Web API&#xff0c;但也可以运行辅助应用程序以运行长任务。 …

本地方法(JNI)——访问数组元素+错误处理

【0】README 1&#xff09; 本文文字描述 均转自 core java volume 2 &#xff0c; 旨在理解 本地方法&#xff08;JNI&#xff09;——访问数组元素错误处理 的基础知识 &#xff1b; 2&#xff09;for source code, please visit : https://github.com/pacosonTang/core-j…

Shell入门(三)之字符串

一、单引号 字符串可以用单引号&#xff0c;也可以用双引号&#xff0c;也可以不用引号。单双引号的区别跟PHP类似。 单引号不存在转义字符&#xff0c;如&#xff1a;\a&#xff0c;\n&#xff0c;$abc #!/bin/bash aabc b${a}bc; echo $b; #结果为&#xff1a;${a}bc…

tms tck_在雅加达EE TCK中使用Arquillian的可能方法

tms tck最近&#xff0c;我们讨论了如何创建独立的Jakarta Batch测试套件&#xff08;TCK&#xff09;。 对于大多数提交者而言&#xff0c;使用Arquillian将测试从实现中如何执行抽象化是很自然的。 但是Romain提出了一个有趣的想法&#xff0c;即使用纯JUnit5引起了我的思考。…

本地方法(JNI)——使用调用API

【0】README 1&#xff09; 本文文字描述source code 均转自 core java volume 2 &#xff0c; 旨在理解 本地方法&#xff08;JNI&#xff09;——使用调用API 的基础知识 &#xff1b; 2&#xff09; for source code, please visit : https://github.com/pacosonTang/cor…

Shell入门(四)之数组

一、一维数组 bash支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;并且没有限定数组的大小。 类似与C语言&#xff0c;数组元素的下标由0开始编号。 二、定义数组 在Shell中&#xff0c;用括号来表示数组&#xff0c;数组元素用"空格"符号分割开。…

aws cloud map_销毁AWS资源:Cloud-Nuke还是AWS-Nuke?

aws cloud map因此&#xff0c;您在开发帐户上工作&#xff0c;并且Terraform陷入了一个循环&#xff0c;难道不让您轻易销毁剩余资源吗&#xff1f; 进入nuke CLI的世界&#xff01; 在撰写本文时&#xff0c;我使用的是v0.1.16版本 用Go语言编写的《 Gruntwork》不会破坏掉…

mysql error 1045 的解决方法

【0】README 1&#xff09;以下是 解决方法的steps&#xff1a; step1&#xff09;点击 skip 和 cancel 退出 mysql 配置 step2&#xff09; 重启mysql server config wizard&#xff0c; 然后 remove instance step3&#xff09; 随后卸载mysql&#xff08;通过360或 …

Shell入门(五)之参数

一、Shell 传递参数 在执行 Shell 脚本时&#xff0c;向脚本传递参数&#xff0c;脚本内获取参数的格式为&#xff1a;$n。n 代表一个数字&#xff0c;0为执行文件名&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数&#xff0c;以此类推 比如&…

openj9下载_Quarkus on OpenJ9 JVM和资源消耗

openj9下载除了本机模式&#xff0c;Quarkus在JVM模式下也能很好地运行&#xff0c;这有其自身的优势。 您可以使用替代的JVM&#xff0c;例如OpenJ9&#xff0c;它可以更好地消耗资源。 在下面的视频中&#xff0c;我将展示交换JVM有多么容易。 在视频中&#xff0c;我在最新…

Shell入门(六)之算术运算

一、数学运算 &#xff08;1&#xff09;原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk 和 expr&#xff0c;expr 最常用。 &#xff08;2&#xff09;expr 是一款表达式计算工具&#xff0c;使用它能完成表达式的求值操作。 ex…

java数据库编程——执行SQL 语句

【0】README 1&#xff09; 本文文字描述source code 均转自 core java volume 2 &#xff0c; 旨在理解 java数据库编程——执行SQL 语句 的基础知识 &#xff1b; 2&#xff09;for source code, please visit &#xff1a; https://github.com/pacosonTang/core-java-vol…

php cdi_Quarkus的其他(非标准)CDI功能

php cdiQuarkus支持CDI&#xff08;上下文和依赖注入&#xff09;2.0&#xff0c;但并非全部&#xff0c;仅支持最常见的功能。 但是&#xff0c;Quarkus确实包含一些非标准功能&#xff0c;这些功能对于开发人员非常方便&#xff0c;我想在下面的视频中进行展示。 不管您是否…

Shell入门(七)之关系运算

一、关系运算 shell关系运算符只支持数字&#xff0c;不支持字符串&#xff0c;除非字符串的值是数字。 a10 b20 运算符说明举例-eq检测两个数是否相等&#xff0c;相等返回 true。[ $a -eq $b ] 返回 false。-ne检测两个数是否相等&#xff0c;不相等返回 true。[ $a -ne $…

java数据库编程——Insert and Retrieve Images from MySql Table Using Java

【0】README0.1&#xff09;本文翻译自 http://harmeetsingh13.blogspot.jp/2013/03/insert-and-retrieve-images-from-mysql.html【1】正文如下&#xff1a;段1&#xff09;演示 从数据库表中插入和查询出图片。大多数情况下&#xff0c;图片数据都存储在数据库外部的一些文件…

Shell入门(八)之布尔运算

一、常规的布尔运算 常规的布尔运算符有&#xff1a;!、&&、|| 使用语法 ! exp exp && exp exp || exp [[ n op m && a op b]] ... exp为[ n op m ]或test n op m或true或false 二、条件测试的布尔运算 条件测试的布尔运算有&#xff1a;!、…

java switch语句_Java 14:查看更新的switch语句

java switch语句于2020年3月发布的JDK 14带有switch语句的更新版本。 这是JDK 12和JDK 13中的预览功能。 要了解差异&#xff0c;让我们看一个简单的示例。 假设我们要基于DayOfWeek枚举来计算每日工作时间。 使用旧的使用switch语句的方法&#xff0c;我们的解决方案可能如下…

java数据库编程——执行查询操作(一)

【0】README 1&#xff09; 本文部分文字描述和source code 均转自 core java volume 2 &#xff0c; 旨在理解 java数据库编程——执行查询操作 的基础知识 &#xff1b; 2&#xff09; 本文和 java数据库编程——执行查询操作&#xff08;二&#xff09; 是姊妹篇&#xff…