[英]How to maintain order of messages among multiple instances of same application
[英]How to maintain unique records in DB table with multiple instances of SpringBoot application
我有一个调度程序,它每 4 小时轮询一次数据,并根据某些逻辑插入表中。 我还使用了@Transactional
注释,并且每次我都会检查表中是否已经存在数据。 如果记录不存在,则插入。 当我是 SpringBoot 应用程序的多个实例时,每个实例都运行调度程序,并且某些数据并非全部重复。 这意味着我发现该表包含重复记录。 我要插入的表是应用程序的现有表,并且没有使用唯一约束定义少数列。 请建议我如何在数据库表中维护唯一记录,即使调度程序从多个实例运行。 我正在使用Postgresql和SpringBoot 。
因此,您问题的直接答案是为表中的每条记录提供唯一标识符。 来自外部 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.