在POSTGRESQL中使用JPA在SELECT查询中获取唯一行

时间:2018-08-16 05:44:06

标签: postgresql spring-boot jpa locking spring-batch

我正在Spring Boot的Spring批处理应用程序中工作,该应用程序将在两个不同的实例中运行,在这种情况下,我必须从表中检索唯一的行。唯一的意思是每个实例一行。例如,
ID语言
1个Java
2个python

如果我有两行,并且当我调用限制为1的SELECT查询时,对于第一个实例,我应该获得id 1,对于第二个实例,应该返回id 2。到目前为止,我已经尝试使用JPA Lock @Lock(value = LockModeType.PESSIMISTIC_WRITE)。这不起作用。每次我得到同一行。我还尝试过将JdbcTemplateSELECT * FROM some_table LIMIT 1 FOR UPDATE SKIP LOCKED一起使用。这也不起作用。我的postgres版本是10.3。有没有办法实现这一目标。

我的应用程序的实例数量将来可能会增加。所以我也想处理这个。

谢谢。

1 个答案:

答案 0 :(得分:0)

您希望每个实例处理表的不同分区。在这种情况下,我建议使用分区步骤。

例如,您可以按偶数/奇数ID对表进行分区,并使每个实例处理一个分区。与锁定表并使用LIMIT 1强制每个实例读取一行相比,这比IMO更好(这不会像您提到的那样起作用,即使它起作用,性能也会很差)。

您可以在此处https://github.com/spring-projects/spring-batch/blob/master/spring-batch-samples/src/main/resources/jobs/partitionJdbcJob.xml处找到如何对表进行分区的示例作业,并在此处https://github.com/spring-projects/spring-batch/blob/master/spring-batch-samples/src/main/java/org/springframework/batch/sample/common/ColumnRangePartitioner.java

中找到相应的分区程序。