我有一个调度程序,每4小时轮询一次数据,并根据一定的逻辑插入到表中。我还使用了@Transactional注释,而且每次都要检查表中是否已经存在数据。如果记录不存在,它将插入。当我是SpringBoot应用程序的多个实例时,每个实例都运行调度程序,并且一些数据并不都会被复制。这意味着我发现那个表包含重复的记录。我要插入的表是应用程序的现有表,很少有列没有被定义为唯一的约束。请建议我如何维护数据库表中的唯一记录,即使调度程序从多个实例运行。我使用的是Postgresql和SpringBoot。
发布于 2022-08-18 09:32:59
因此,对问题的直接回答是对表中的每条记录都有唯一的标识符。来自外部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;
}
}然后,您将基于uniqueId字段在DB端拥有唯一的索引,而DB将防止重复。
重要的是-你不能用
@GeneratedValue(strategy = GenerationType.IDENTITY)因为每次将对象保存到DB时,它都会生成新的id。在这种情况下,可以从不同的实例多次保存相同的对象。
,但在您的例子中,我会提出另一种解决方案,的想法是只运行一次预定任务。here已经回答了这个问题
https://stackoverflow.com/questions/73400303
复制相似问题