DynamoDBMapper 仅在唯一时保存项目

2023-11-24

我试图根据两个不同列的组合来保持表中项目的唯一性。

我有一个 instanceId 和 imageId 列(以及其他列),并基于以下几篇文章堆栈溢出 and AWS 论坛下面应该工作吗?

public void saveUnique(Server server) {
    DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
    Map<String, ExpectedAttributeValue> expectedAttributes =
        ImmutableMap.<String, ExpectedAttributeValue>builder()
            .put("instanceId", new ExpectedAttributeValue(false))
            .put("imageId", new ExpectedAttributeValue(false))
            .build();
    saveExpression.setExpected(expectedAttributes);
    saveExpression.setConditionalOperator(ConditionalOperator.AND);
    try {
        mapper.save(server, saveExpression);
    } catch (ConditionalCheckFailedException e) {
        //Handle conditional check
    }
}

然而,每次我尝试保存重复的项目(相同的instanceId和imageId)时,它都会成功保存到数据库中。

我在这里还遗漏了什么吗?

编辑R.E概念问题答案

更新到下面的答案。

我有一个每分钟运行一次轮询 API 的作业。来自 API 的响应表示为Server波乔。这Server有一个名为instanceId.

我想确保如果Server接着就,随即instanceId已在数据库中,请勿保存。

The Server对象还有另一个属性id它被设置为表主键。

public void saveUnique(Server server) {
    DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();

    Map<String, ExpectedAttributeValue> expected = new HashMap<>();
    expected.put("instanceId", new ExpectedAttributeValue(new AttributeValue(server.getInstanceId())).withComparisonOperator(ComparisonOperator.NE));
    saveExpression.setExpected(expected);

    try {
        mapper.save(server, saveExpression);
    } catch (ConditionalCheckFailedException e) {
        LOGGER.info("Skipped saving as not unique...");
    }
}

此代码将一遍又一遍地保存服务器对象,并且永远不会抛出异常。

服务器 POJO

@DynamoDBTable(tableName = "Servers")
public class Server {

    @Id
    private String id = UUID.randomUUID().toString();

    @DynamoDBTypeConvertedJson
    private Task task;

    @DynamoDBAttribute(attributeName = "instanceId")
    private String instanceId;

    public Server() {
    }

    @DynamoDBHashKey
    public String getId() {
        return id;
    }

    // other standard getters and setters
}

2019年更新

2019 年,自提出问题以来,这里似乎没有任何变化。在 DynamoDB 中,为非主键字段提供唯一性仍然很棘手。这是最近在亚马逊上发布的一篇文章:https://aws.amazon.com/blogs/database/simulated-amazon-dynamodb-unique-constraints-using-transactions/

基本上,作者建议在同一个表中创建辅助记录,而不是使用如下所述的附加表。

例如,在下图中,为了确保instance_id=2c5d0cc8d900是唯一值,您必须添加 具有人工主键值“instance_id#2c5d0cc8d900”的记录。如果插入成功,您可以插入主记录本身。

+--------------------------+-------------------------+--------+----------------
|           id             |       instance_id       | attr1  | other fields... 
|                          |                         |        |
|      (primary key)       |     (a non-key field,   |        |
|                          |     must be unique)     |        |
+--------------------------+-------------------------+--------+----------------
| instance_id#2c5d0cc8d900 |                         |        |
| a9fd702a                 | 2c5d0cc8d900            | qwerty | ...

虽然这种方法可能效果很好,但我个人仍然更喜欢使用单独的表格,如下我原来的答案中所述。因为,当从包含此类辅助记录的表中读取数据时,您必须注意从实际记录中过滤它们。


原答案

如果我正确理解了这个问题,您希望确保不是哈希键的字段的唯一性。

(我不确定你为什么不使用instanceId作为服务器表的哈希键,我想你有理由这样做)。

我的回答:看起来像如果不使用辅助表,你就无法做到这一点.

这是您现有的服务器表:

+----------------------------------------------+
|                 Servers                      |   
+----------------------------------------------+
| * id            the hash key                 |
| * instanceId    non-key field, must be unique|
|                                              |
| * ...                                        |
| * other fields                               |
| * ...                                        | 
+----------------------------------------------+

我将创建一个附加表,其中 instanceId 作为哈希键:

+----------------------------------------------+
|                 Instance                     |   
+----------------------------------------------+
| * instanceId    the hash key                 |
+----------------------------------------------+

有了这样一个表,在将记录保存到服务器之前,您必须 首先通过向 Instance 添加一条记录 (putItem) 来确保 instanceId 值是唯一的,并提供一个 ConditionExpression,例如attribute_not_exists(instanceId).

并且仅当 put 操作在没有ConditionalCheckFailedException错误,您可以继续将记录添加到服务器中。

如果您想基于instanceId和imageId这两个字段的组合来确保服务器中记录的唯一性, 使用这些字段的串联值作为 aux 表中的单个字段,而不是仅使用 instanceId:

+----------------------------------------------+
|               Instance_Image                 |   
+----------------------------------------------+
| * instanceId_imageId   the hash key          |
+----------------------------------------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DynamoDBMapper 仅在唯一时保存项目 的相关文章

  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • 使用 CognitoIdentityServiceProvider 的 adminCreateUser 方法的 AWS Lambda 函数突然失败

    在过去的几天里 我一直在使用 AWS Lambda 函数测试特定流程 并且在 Cognito 用户池中预注册后触发的 lambda 函数工作正常并很好地返回回调函数 但从昨天开始我就看到了以下错误 ntime node modules aw
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • 如何在AWS中从快照创建Windows实例

    我的公司想要在 Amazon Web Service 中拍摄窗口的每日快照 我们可以毫无问题地拍摄快照 但是当我尝试从快照创建实例时 它总是创建一个 Linux ami 所以当服务器启动时 它总是无法通过健康检查 是否可以从快照创建 Win
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • Nginx url 限制 502 网关

    我有一个问题 但我接受绕过此功能的其他建议 基本上 我在 get 请求中向我的服务器发送大约 3000 个字符的大行文本 然后服务器将其作为 url 中的参数发送到谷歌翻译 问题 当 url gt 1900 个字符时 Nginx 会抛出 5
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 为什么 apt-get 功能在 Mac OS X v10.9 (Mavericks) 的终端中不起作用?

    我当时正在看this 正如您所看到的 我被告知要输入的第一个命令是 sudo apt get install python setuptools 当我这样做时 它输出 sudo apt get command not found 我不知道为
  • -I GCC 中的标志(Linux)

    我找到了一个带有 Makefile 的源文件包 我浏览了它 在 CFLAG 变量中 有一个 FLAG I 我在网上搜索过 但找不到它实际的作用 它与 C 文件中包含的库文件有关吗 stdio h unistd h pthread h 请指出
  • Javascript 获取对象属性名称

    我传递了以下对象 var myVar typeA option1 one option2 two 我希望能够拔出钥匙typeA从上面的结构来看 这个值每次都会改变 所以下次它可能会改变typeB 所以我想知道是否有办法让我做类似以下伪代码的
  • LibGDX 中的 AssetManager

    我正在尝试使用AssetManagerLibGDX 中的类 我了解它是如何工作的 但我正在尝试实现一个加载屏幕 我已遵循AssetManagerTest java file here 但我很难弄清楚如何让它正常工作 有人能指出我正确的方向吗
  • 是否可以更改 ToolStripMenuItem 工具提示字体?

    我有一个动态填充的 ContextMenuStrip 其中每个 ToolStripMenuItem 都有一个工具提示的格式化文本 而且 为了使该文本对用户有意义 我必须使用等宽字体 例如 Courier New 默认字体是常规的非等宽字体
  • 当字段为空时,远程属性不会触发

    我在用着RemoteAttribute对于我表单上的特定字段 其目的并不重要 重要的是 每当字段发生更改时 它都需要触发验证操作 这对我来说工作得很好 除非该字段更改为空白 我用谷歌搜索过这个但没有找到结果 有谁知道如果RemoteAttr
  • 带有 lapply 的内部 S3 泛型

    我有一个 S3 通用函数 我希望将其作为包的内部部分 如果可能的话我宁愿不导出它 一个有趣的缺点是 似乎lapply无法找到或使用正确的 S3 方法 有谁知道这种行为背后的原因 下面是一个可重现的示例 其中涉及从我的 github 安装虚拟
  • 在导航控制器中单击后退按钮时会调用哪个方法?

    我想在导航控制器中单击后退按钮时保存数据库 所以我会在方法中插入代码 在导航控制器中单击后退按钮时会调用什么方法 要执行您要求的操作 请查看UINavigationControllerDelegate协议 即方法 void navigati
  • Scala 的 Actor 是否有非阻塞 IO 开源实现?

    我需要处理相当大的文件 500Meg zip 文件 Scala 的 actor 是否有非阻塞 IO 开源实现 如果我的问题是正确的 那么您需要文件的非阻塞 IO 那么我有坏消息要告诉你 NIO Java6 中的 Java NIO 在处理文件
  • 如何确定两组纬度/经度坐标之间的距离?

    我正在尝试写一些东西来确定纬度 经度坐标组之间的距离 我正在使用我在上面找到的以下代码这个网站 public static double distance double lat1 double lon1 double lat2 double
  • 使用 python 中的 Optimize.leastsq 方法获取拟合参数的标准误差

    我有一组数据 位移与时间 我使用 optimization leastsq 方法将其拟合到几个方程中 我现在正在寻找拟合参数的误差值 查看文档 输出的矩阵是雅可比矩阵 我必须将其乘以残差矩阵才能得到我的值 不幸的是 我不是统计学家 所以我有
  • 为什么 Blueimp 的 JQuery 文件上传会添加所有上一个文件。即使在 init 上设置了选项 [replaceFileInput: false] 和 [maxNumberOfFiles: 1],是否仍选择文件?

    我只有普通形式 带有一些输入字段和一个文件输入字段 我使用 Blueimp 的 Jquery 文件上传插件来上传文件 如果您选择一个文件然后单击上传按钮 它似乎可以工作 但是 如果您重新选择要上传的文件 它会保存所有选择的历史记录 并在上传
  • 为什么在循环中使用 sleep 时,Python 中的 print 不会暂停?

    这段代码 import time for i in range 10 print i time sleep 5 导致我的计算机挂起 5 秒 然后打印出 0 9 而不是每半秒打印一个数字 难道我做错了什么 print 默认情况下 打印到sys
  • Django获取视图中的静态文件URL

    我正在使用 reportlab pdfgen 创建 PDF 在 PDF 中有一张由以下人员创建的图像drawImage 为此 我需要图像的 URL 或视图中图像的路径 我成功构建了 URL 但如何获取图像的本地路径 我如何获取网址 pref
  • libc++ 的 wchar_t 输出

    include
  • PCWSTR 与 LPWSTR

    据我了解 如果我错了 请纠正我 它们之间的唯一区别是字符串是否可以被调用的函数修改 PCWSTR LPWSTR 我现在尝试将一个字符串从 C 传递到一个期望的函数PCWSTR 但我能找到的只是 MarshalAs UnmanagedType
  • C++:构造函数中的多维数组初始化

    我想在 C 中使用恒定大小的二维数组作为类成员 不过 我在构造函数中初始化它时遇到问题 这是我的非工作尝试 1 class A public int a 2 2 A A A a 1 2 2 4 yields error assigning
  • 将 SQL Server Compact Edition 数据源添加到 Visual Studio 中?

    我想在 Visual Studio 2013 4 的项目中添加 SQL Server Compact 版本 但我的列表中没有数据源 另外 我没有System Data Sqlce在我的集会上 如何将 SQL Server Compact 数
  • java.lang.NoSuchMethodError:accessibilityHitTest

    我正在使用 Sikulix 2 0 6 消息字段有错误 java lang NoSuchMethodError accessibilityHitTest 我看了https github com openjdk jdk pull 5702 但
  • DynamoDBMapper 仅在唯一时保存项目

    我试图根据两个不同列的组合来保持表中项目的唯一性 我有一个 instanceId 和 imageId 列 以及其他列 并基于以下几篇文章堆栈溢出 and AWS 论坛下面应该工作吗 public void saveUnique Server