postgresql - 在 POSTGRESQL 中使用 JPA 获取 SELECT 查询中的唯一行
问题描述
我在 Spring Boot 中的 Spring 批处理应用程序中工作,它将在两个不同的实例中运行,我有一个场景,我必须从表中检索唯一的行。我的意思是唯一的,每个实例一行。例如
id 语言
1 java
2 python
如果我有两行并且当我调用一个SELECT
限制为一个的查询时,对于第一个实例,我应该得到 id 1,对于第二个实例,应该返回 id 2。到目前为止,我已经尝试使用 JPA Lock@Lock(value = LockModeType.PESSIMISTIC_WRITE)
这不起作用。每次我得到相同的行。我也尝试过使用JdbcTemplate
with SELECT * FROM some_table LIMIT 1 FOR UPDATE SKIP LOCKED
。这也行不通。我的 postgres 版本是 10.3 。有没有办法做到这一点。
我的应用程序的实例数量将来可能会增加。所以我也想处理这个。
提前致谢。
解决方案
您希望每个实例处理表的不同分区。在这种情况下,我建议使用分区步骤。
例如,您可以按偶数/奇数 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
推荐阅读
- javascript - 使用 react-select 及其 menuIsOpen 属性的问题
- javascript - 如何在头部的脚本标签中传递参数
- php - 使用 Uppy 将文件从 ReactJs 上传到 PHP 服务器(Yii2)
- hash - 无法用循环解开一些刚刚用 python 3 腌制的数据
- c++ - `std::chrono` 时钟与`boost::xtime` 的比较
- python - Python for循环:执行第二行覆盖在第一行创建的对象
- android - 无法在 Intellij 上启动 android
- c# - 如何自定义 TabbedPage 标签栏?
- c# - 错误 CS0115: 'PopupField
.ExecuteDefaultAction(EventBase)':找不到合适的方法来覆盖 - powershell - 如何只允许某些 PowerShell 命令在 PowerShell 上运行?