【问题标题】:How to update oracle row programatically in java when a record is fetched (Record fetch and update will be bulk)获取记录时如何在java中以编程方式更新oracle行(记录获取和更新将是批量的)
【发布时间】:2020-11-21 17:03:21
【问题描述】:

我正在使用 Spring Boot 和 Oracle。

我有一个调度程序应用程序,它根据预定时间/有效时间从数据库中获取记录。应用程序每 30 秒从数据库中获取记录。它会不断地在数据库中查找以下情况并获取数据。

条件:当前时间>=预定时间(或)当前时间

(请注意:数据库中的记录未排序)。即,我可能将记录安排在下个月,现在安排的记录可能在前 100 条记录之后可用。所以没有顺序。

我的问题是,根据我的情况,已经处理的记录也正在被提取。

例如:

  • 记录 1:预定在未来 10 分钟内,有效期至未来 10 天

  • 记录 2:预定明天,有效期至接下来的 10 天

  • 记录 3:现在预定,有效期 10 天。

我的进程现在应该只获取记录 3。但由于 OR 条件,所有 3 条记录都被提取并正在处理中。

我尝试使用预定时间和其他条件仅处理记录 3,但是在 10 分钟后处理时,记录 3 带有记录 1。

有没有办法在 JAVA 或 Oracle 或 SQL 中更新获取和处理的记录?

我想过使用光标,但光标按顺序工作。所以没有运气。

请给出一个最佳解决方案来处理这个问题,因为我可能有数十万条记录需要以同样的方式处理。

【问题讨论】:

  • 如果您不想要尚未计划的记录,为什么会有 OR 而没有 AND?如果你只想处理一次记录,你不应该有一个状态字段吗?
  • 那些预定的记录可能会在以后被批准。所以我还必须检查有效期以处理它们。这就是我使用 OR 而不是 AND 的原因。我有一个状态字段,但这不会有任何好处。
  • 如果有状态字段,为什么不排除已经处理的行?

标签: sql spring oracle spring-boot scheduler


【解决方案1】:

您可以简单地使用select ... from ... for update skip locked。在这种情况下,由于for update,获取的行将被锁定,并且每次选择都会跳过锁定的行。

或者您也可以在 plsql 中使用 update ... where ... set status='processed' returning ... bulk collect into {collection} 并将此集合返回(获取)到您的 Java 应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2012-09-04
    • 1970-01-01
    • 2023-03-22
    • 2021-12-13
    • 2017-07-27
    • 2017-05-28
    相关资源
    最近更新 更多