使用适用于Java 2的AWS开发工具包的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

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

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

相关文章

win7计算机个性化设置,笔记本电脑windows7系统如何用好电脑个性化设置

笔记本电脑windows7系统想要用好电脑个性化设置&#xff0c;该怎么办呢&#xff0c;下面是学习啦小编收集整理的笔记本电脑windows7系统如何用好电脑个性化设置&#xff0c;希望对大家有帮助~~笔记本电脑windows7系统用好电脑个性化设置的方法右击桌面空白区域&#xff0c;在弹…

发动机冷启动和热启动的区别_「牛车实验室」AGM自动启停蓄电池解读 和普通蓄电池到底有什么区别...

[资讯-牛车网]为了节省燃油&#xff0c;越来越多的新车搭载了自动启停功能。搭载了这项功能的汽车&#xff0c;都会随之搭配一块独立的自动启停蓄电池&#xff0c;这块电池只单独为自动启停系统工作。那么同是蓄电池&#xff0c;自动启停电池和普通蓄电池有什么区别&#xff0c…

返回内容验签失败_邮件经常失败回弹很糟心?一定要知道这几个小知识

很多人都反应每次发送邮件&#xff0c;总有一部分发生失败回弹&#xff0c;大大影响了送达率&#xff0c;非常糟心&#xff01;今天我们为大家整理了一些常见关于发送回弹状态的相关知识以及如何避免邮件回弹的注意事项。一、回弹状态的两种类型邮件发送失败时ESP(邮件供应服务…

用火狐录制脚本为空_功能测试——链接测试amp;脚本功能

链接测试对于页面链接功能&#xff0c;测试工程师需考虑其链接文字描述正确性、链接地址跳转正确性、链接触发脚本正确性、是否存在404错误等。如果是小型Web系统&#xff0c;链接较少&#xff0c;人工测试即可&#xff0c;如果被测对象包含很多链接&#xff0c;则可利用Xenu链…

笔记本电脑显示打印机服务器关闭,笔记本win10系统的打印机服务怎么禁用或重启...

笔记本win10系统的打印机服务怎么禁用或重启腾讯视频/爱奇艺/优酷/外卖 充值4折起在我们的生活中&#xff0c;如果打印机出错了&#xff0c;我们就需要关闭打印机或者重启打印机&#xff0c;那么笔记本的win10系统禁用/启动打印机服务方法是什么呢&#xff1f;下面小编告诉大家…

junit runner_了解JUnit的Runner架构

junit runner几周前&#xff0c;我开始创建一个小的JUnit Runner&#xff08; Oleaster &#xff09;&#xff0c;它允许您使用Jasmine方式在JUnit中编写单元测试。 我了解到&#xff0c;创建自定义JUnit Runners实际上非常简单。 在这篇文章中&#xff0c;我想向您展示JUnit R…

php 邮件服务器 群发,发送使用PHP群发电子邮件发送使用PHP群发电子邮件(Sending mass email usin...

我目前正在写一个音乐博客。 管理员发布一个新的文章每2-3天。 一旦管理员岗位的文章&#xff0c;群发电子邮件将被立即发送到5000左右的用户。什么是实现群发邮件功能的最佳方法是什么&#xff1f;请问下面的函数工作&#xff1f;function massmail(){$content ...;foreach (…

linq判断集合中相同元素个数_iOS开发swift语法梳理:集合Set

1.集合的三特性确定性&#xff1a;给定一个集合&#xff0c;任意给一个元素&#xff0c;该元素或者属于或者不属于该集合&#xff0c;二者必居其一。互斥性&#xff1a;一个集合中的所有元素都是不相同的。无序性&#xff1a;每个元素的地位相同&#xff0c;元素之间是无序的。…

python监控服务器信息,Python监控服务器实现邮件微信报警

本文中笔者暂时实现的只有cpu和内存的监控&#xff0c;python可以监控许多的主机信息&#xff0c;网络&#xff0c;硬盘&#xff0c;机器状态等&#xff0c;以下是代码的实现&#xff0c;代码可以实现windows和 linux 的监控。实验环境&#xff1a;Ubuntu16.04和windos10&#…

延迟关机_苹果电脑到底需不需要关机?关机和休眠你选择哪个

刚买了MacBook的朋友&#xff0c;会不会跟小编一样&#xff0c;是格外的珍惜&#xff0c;总想以一种最好的方式使用自己人生中第一个苹果电脑。苹果笔记本需要关机吗&#xff1f;不关机会卡吗&#xff1f;也成了自己关心的话题&#xff01;Mac 到底要不要关机&#xff0c;这个问…

10鼎信诺为什么安装不了_鼎信诺审计软件一周常见问题(4.134.17)

今天介绍一下近期咨询较多的两款财务软件在取数后不能显示辅助核算明细的问题&#xff0c;分别是诺诺云和亿企代账&#xff0c;这两款软件都是采用云记账方式&#xff0c;均可以通过其平台中的导出审计数据的功能导出一个备份文件夹&#xff0c;备份文件夹中都是TXT格式的文本文…

Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 如果您已经成为Java开发人员超过15年&#xff0c;那么您可能还记得什么时候有过多的J…

函数传参字典_Python 函数中的 4 种参数类型

作者&#xff1a;小小程序员链接&#xff1a;https://zhuanlan.zhihu.com/p/89538123来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。在调用函数时&#xff0c;通常会传递参数&#xff0c;函数内部的代码保持不变&#x…

gc频繁的暂停启动_减少主要GC暂停的频率

gc频繁的暂停启动这篇文章将讨论一种减少垃圾收集暂停的技术&#xff0c;它会延迟应用程序的延迟。 正如我几年前所写&#xff0c; 在JVM中无法禁用垃圾收集 。 但是&#xff0c;有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。 如您所知&#xff0c;JVM内部发生了…

部署war文件到服务器,war包怎么部署到云服务器

war包怎么部署到云服务器 内容精选换一换部署提供可视化、一键式部署服务&#xff0c;支持并行部署和流水线无缝集成&#xff0c;实现部署环境标准化和部署过程自动化。本节通过以下四步介绍如何使用部署服务将归档在软件发布库的软件包部署到云主机上。第一步&#xff1a;准备…

Java 8中的StringJoiner与String.join的示例

将多个String文字或对象合并为一个是常见的编程要求&#xff0c;并且经常会发现需要为应用程序将String列表或String集合转换为CSV String的情况。 长期以来&#xff0c;JDK API无法将多个String文字或对象连接在一起&#xff0c;这迫使程序员编写诸如遍历所有String对象并使用…

中如何将方形图片转换成圆形图片_【PS】PS中不可不知的实用技巧!你都掌握了吗?...

今天给大家分享一些在PS中经常用到的实用小技巧&#xff0c;操作简单易上手。01 拉伸图片人物不变形在我们在PS里想要拉伸一些图片时&#xff0c;里面的人物往往会跟着一起变形&#xff0c;那么如何改变图片比例的同时&#xff0c;又不影响人物的形态呢&#xff1f;打开我们需要…

使用JUnit对ADF应用程序进行单元测试

JUnit是Java语言的单元测试软件包&#xff0c;由于ADF构建在J2EE框架之上&#xff0c;因此可以用来测试Oracle ADF应用程序。 单元测试基本上是根据某些定义的测试标准来验证最小的可测试模块的过程。 在这里&#xff0c;我将说明如何在JDeveloper 12.2.1.3中设置和使用JUnit来…

拆分js文件_2021入门Webpack,看这篇就够了:Webpack.config.js 解析

这是优妈成长记的第63篇原创这是一个webpack配置说明本文是发布在github上webpack-demo的README文件内容。主要对webpack.config.js每一条的注释说明。github项目地址&#xff1a;https://github.com/hourong88/webpack-demo可以点击文章最下方【阅读原文】跳转github链接查看&…

orcad自上而下_开发自上而下的Web服务项目

orcad自上而下这是从Alessio Soldano编辑的Advanced JAX-WS Web Services手册中摘录的示例章节。 第一章介绍了自底向上创建Web服务端点的方法。 它允许非常快地将现有bean作为Web Service端点公开&#xff1a;在大多数情况下&#xff0c;将类转换为端点只需在代码中添加少量注…