Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并发读取-使用jpa hibernate中的不同java应用程序实例从同一个表中读取不同的行_Java_Sql_Hibernate_Jpa - Fatal编程技术网

并发读取-使用jpa hibernate中的不同java应用程序实例从同一个表中读取不同的行

并发读取-使用jpa hibernate中的不同java应用程序实例从同一个表中读取不同的行,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我正在SpringBoot中编写一个调度程序,它将执行以下操作。 从表中读取2行(数据库-oracle) 做些手术 然后更新步骤1中读取的行的一个字段值。 当我将应用程序作为两个单独的实例运行时,将运行两个调度程序。这将使上述所有步骤重复两次 我的目标是,如果第一个实例的计划在该时间读取两行,那么第二个实例的计划将读取下两行,而不是同一行 请建议使用JPA或Java执行此操作的任何方法 让我们看看您的需求: 每个流程实例应该从某个表中读取两行 由一个进程处理的两行集合对于任何其他进程都是禁止的

我正在SpringBoot中编写一个调度程序,它将执行以下操作。

  • 从表中读取2行(数据库-oracle)
  • 做些手术
  • 然后更新步骤1中读取的行的一个字段值。

  • 当我将应用程序作为两个单独的实例运行时,将运行两个调度程序。这将使上述所有步骤重复两次 我的目标是,如果第一个实例的计划在该时间读取两行,那么第二个实例的计划将读取下两行,而不是同一行 请建议使用JPA或Java执行此操作的任何方法

    让我们看看您的需求:

  • 每个流程实例应该从某个表中读取两行
  • 由一个进程处理的两行集合对于任何其他进程都是禁止的
  • 您不希望等待一个进程完成前两行集合,然后秒进程再提取它的两行
  • 现在如何解决呢

  • 这是基本的-你已经有了,对吗
  • 可以用不同的方法来完成,所以让我们先看看
  • 禁止阻塞。这意味着:任何正在启动的进程都必须知道其他进程正在处理的行
  • 因此,您需要对流程将要处理的两行进行某种“保留”

    我会这样处理:

    • 在表中添加一个锁列,作为“我当前正在工作”的标记
    • 修改选择查询以忽略已锁定的列和
    • 修改更新的选择查询
      ,防止其他进程执行相同操作。(是的,这是在阻止其他人,但只有在你这样做的时候)
    • 现在更新两行以设置锁定标记或进程
    • 做你必须做的事
    • 准备好执行步骤3(更新字段)后,重置锁定标记
    您可能希望采取额外措施,在设置锁标记后但在释放它们之前,一个进程将终止,这可能最终导致从未处理的行—可能需要在锁列中设置一个时间戳值,并根据合理的时间增量选择锁(进程每10分钟运行一次-任何超过30分钟的进程都可能崩溃)