繁体   English   中英

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

[英]How to maintain unique records in DB table with multiple instances of SpringBoot application

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

因此,您问题的直接答案是为表中的每条记录提供唯一标识符。 来自外部 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 + System.currentTimestamp();
    }
}

然后,您将根据uniqueId字段在 DB 端拥有唯一索引,并且 DB 会防止您重复。

重要 - 你不能使用

@GeneratedValue(strategy = GenerationType.IDENTITY)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM