Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Java 如何确保在多实例环境中只有一个批次可以查询oracle表?_Java_Database_Oracle - Fatal编程技术网

Java 如何确保在多实例环境中只有一个批次可以查询oracle表?

Java 如何确保在多实例环境中只有一个批次可以查询oracle表?,java,database,oracle,Java,Database,Oracle,我的项目要求定期向特定类型的客户发送短信,比如说每两天 客户信息存储在Oracle数据库的表中。Spring Boot中的调度器每两天查询一次表,发送SMS,然后更新表以指示SMS已发送。这个解决方案在单实例生产环境中就足够了 但事实上,生产环境有四个实例。因此,每两天运行4个调度程序实例。如果多个实例同时查询表,客户可能会收到多条短信 我可以知道是否有一个适当的解决方案,以防止另一批查询表,如果一个这样做?只有当一个批次完成表的更新后,其他批次才能继续 我只是在想,锁定批次是否可行。假设批次1

我的项目要求定期向特定类型的客户发送短信,比如说每两天

客户信息存储在Oracle数据库的表中。Spring Boot中的调度器每两天查询一次表,发送SMS,然后更新表以指示SMS已发送。这个解决方案在单实例生产环境中就足够了

但事实上,生产环境有四个实例。因此,每两天运行4个调度程序实例。如果多个实例同时查询表,客户可能会收到多条短信

我可以知道是否有一个适当的解决方案,以防止另一批查询表,如果一个这样做?只有当一个批次完成表的更新后,其他批次才能继续


我只是在想,锁定批次是否可行。假设批次1正在查询表,那么批次2 3 4在批次1发布之前无法访问表

您可以创建条件属性调度程序。然后在部署实例的服务器上的属性文件中重写该属性。所以,您的调度程序bean将仅在属性匹配条件的实例上

@Component
@ConditionalOnProperty(prefix = "batch.", value = "enable")
在服务器上的prop文件中,添加您需要的具有布尔值的属性:

batch.enable: false

链接到spring扫描属性规则:

Thx Roman。但如果这样做,批处理只在一个实例上工作,这不是在生产环境中设置四个实例进行故障切换的目的。我认为最好的解决方案是使用批处理所需的所有逻辑创建服务。调度程序将调用作业的服务方法。服务将对作业进行排队,并将使它们依次进行。