当前位置: 首页 > 知识库问答 >
问题:

如何使用多个 SpringBoot 应用程序实例维护数据库表中的唯一记录

司易安
2023-03-14

我有一个调度程序,它每 4 小时轮询一次数据,并根据某些逻辑插入到表中。我还使用了@Transactional注释,并且每次检查表中是否已存在数据。如果记录不存在,它将插入。当我是 SpringBoot 应用程序的多个实例时,每个实例都运行调度程序,并且某些数据并非全部重复。这意味着我发现该表包含重复记录。我插入的表是应用程序的现有表,很少有列没有使用唯一约束进行定义。请告诉我即使调度程序从多个实例运行,如何在数据库表中维护唯一记录。我正在使用Postgresql和SpringBoot。

共有1个答案

劳英华
2023-03-14

因此,对您的问题的直接答案是为表中的每个记录都有唯一的标识符。来自外部API的唯一id将是完美的匹配。如果你没有,你可以手动计算。举个例子:

@Entity @Table
public class Person {
    private String fieldOne;
    private String fieldTwo;
    @Column(unique=true)
    private String uniqueId;
    
    //in case you have to generate uniqueId manually
    public static Person fromExternalApi(String fieldOne, String fieldTwo) {
        Person person = new Person();
        person.fieldOne = fieldOne;
        person.fieldTwo = fieldTwo;
        person.uniqueId = fieldOne + fieldTwo;
    }
}

然后您将在DB端拥有基于uniqueId字段的唯一索引,并且DB可以防止您重复。

重要-您不能使用

@GeneratedValue(strategy = GenerationType.IDENTITY)

因为每次将对象保存到数据库时,它都会生成新的 ID。在这种情况下,您可以从不同的实例多次保存同一对象。

但对于你的情况,我会建议另一种解决方案。想法是只运行一次计划任务。这里已经回答了这个问题

 类似资料:
  • 我们正在使用Firebase实时数据库在flutter中开发一个应用程序,为不同的客户提供多种服务。我想为使用相同Firebase项目的每个客户拥有不同的数据库。由于Firebase在同一个项目中支持多个数据库,我相信可以使用Firebase Datase插件实现。 我试图设置对辅助数据库的引用,但我找不到一个稳定的突击队来更改此数据库的实例。如果您使用的是Java或其他使用Firebase的语言

  • 问题内容: 如何在Java中创建唯一/不同对象(无重复)的列表? 现在,由于密钥已被覆盖,因此我正在使用它,因此最后我们可以获得唯一的密钥。但是我相信应该有一种更好的方法,因为这里浪费了价值部分。 问题答案: 您可以使用Set实现: 来自JAVADoc的一些信息: 一个不包含 重复元素的集合 。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)最多包含一个空元素。顾名思义,此接

  • 问题内容: 我有一个多维数组设置,如下所示: 在该区域中搜索“名称”中的重复值并将其删除以使多维数组中的每个值都是唯一的最佳方法是什么? 提前致谢! 问题答案: 由于每个人都提供了替代方案,因此这里是解决当前问题的方法。有时,我们必须使用已有的数据,而不必按照自己喜欢的方式进行重新排列。话虽如此,这将从阵列中删除所有重复的后续条目。 看起来像这样:

  • 我正在将当前的应用程序迁移到多租户体系结构。由于只有一个代码库,我需要解决多个租户的问题。我使用的是单数据库、多模式的方法。每个租户将被分配一个单独的模式,其中元数据保存在默认模式中。 应用程序是用ASP构建的。NET MVC。我使用Dapper连接到我的SQL Server。我有50个函数,使用直接查询和存储过程调用数据库。当为每个租户初始化dapper时,是否有任何方法可以在不改变函数的情况下

  • 我目前正在开发几个应用程序,主要托管在Azure上:一个调用托管在Azure上的API的Excel加载项(Office应用程序),一个托管在Azure上的web应用程序,以及以后可能的其他应用程序。 为了对用户进行身份验证,我使用Azure Active Directory(Azure AD),基于Web API的令牌身份验证和Web应用程序的OpenID。因此,对API或Web应用程序的每次调用

  • 我们使用swisscoms应用云,目前正在评估新的Elasticsearch服务。我们设置了包括logstash和Kibana。 我们现在为每个应用程序添加了一个用户提供的服务,这些应用程序应该使用通用的ElasticSearch/LogStash/Kibana实例。当我们第一次登录kibana时,我们看到有一个名为的索引,所有应用程序的所有日志都在这里。 现在我们想要的是为每一个写到elk实例的