首页 > 解决方案 > 在 POSTGRESQL 中使用 JPA 获取 SELECT 查询中的唯一行

问题描述

我在 Spring Boot 中的 Spring 批处理应用程序中工作,它将在两个不同的实例中运行,我有一个场景,我必须从表中检索唯一的行。我的意思是唯一的,每个实例一行。例如
id 语言
1 java
2 python

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

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

提前致谢。

标签: postgresqlspring-bootjpalockingspring-batch

解决方案


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

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

您可以在此处找到如何对表进行分区的示例作业: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


推荐阅读