Java 如何确保在多实例环境中只有一个批次可以查询oracle表?
我的项目要求定期向特定类型的客户发送短信,比如说每两天 客户信息存储在Oracle数据库的表中。Spring Boot中的调度器每两天查询一次表,发送SMS,然后更新表以指示SMS已发送。这个解决方案在单实例生产环境中就足够了 但事实上,生产环境有四个实例。因此,每两天运行4个调度程序实例。如果多个实例同时查询表,客户可能会收到多条短信 我可以知道是否有一个适当的解决方案,以防止另一批查询表,如果一个这样做?只有当一个批次完成表的更新后,其他批次才能继续Java 如何确保在多实例环境中只有一个批次可以查询oracle表?,java,database,oracle,Java,Database,Oracle,我的项目要求定期向特定类型的客户发送短信,比如说每两天 客户信息存储在Oracle数据库的表中。Spring Boot中的调度器每两天查询一次表,发送SMS,然后更新表以指示SMS已发送。这个解决方案在单实例生产环境中就足够了 但事实上,生产环境有四个实例。因此,每两天运行4个调度程序实例。如果多个实例同时查询表,客户可能会收到多条短信 我可以知道是否有一个适当的解决方案,以防止另一批查询表,如果一个这样做?只有当一个批次完成表的更新后,其他批次才能继续 我只是在想,锁定批次是否可行。假设批次1
我只是在想,锁定批次是否可行。假设批次1正在查询表,那么批次2 3 4在批次1发布之前无法访问表 您可以创建条件属性调度程序。然后在部署实例的服务器上的属性文件中重写该属性。所以,您的调度程序bean将仅在属性匹配条件的实例上
@Component
@ConditionalOnProperty(prefix = "batch.", value = "enable")
在服务器上的prop文件中,添加您需要的具有布尔值的属性:
batch.enable: false
链接到spring扫描属性规则:Thx Roman。但如果这样做,批处理只在一个实例上工作,这不是在生产环境中设置四个实例进行故障切换的目的。我认为最好的解决方案是使用批处理所需的所有逻辑创建服务。调度程序将调用作业的服务方法。服务将对作业进行排队,并将使它们依次进行。