java - Java - Cron 作业 - 如果一个实例触发批处理作业,则阻止其他实例执行相同操作
问题描述
我有一个在两个实例上运行的应用程序,实例之间的唯一通信是它们在单个数据库上运行。我有几个批处理作业在上面运行。例如:将记录从数据库复制到文件并将文件传送到服务器。由于这两个实例都有一个公共数据库,因此我正在尝试写入已触发作业的表。基本上,触发条件是给定表上不存在这样的记录。如何以原子方式执行此操作,即检查未触发作业的表然后插入表中?
解决方案
悲观锁定在这里可以提供帮助:
- 创建一个保存锁定记录的专用表,最后执行时间
- 在计划的执行中,获取(或创建)一个注入的锁
EntityManager
记录LockModeType.PESSIMISTIC_WRITE
。 - 检查锁定记录的执行时间:如果最近更新,则作业必须已经在另一个实例上运行
- 否则,执行作业,之后更新锁记录上的最后执行时间。
有关选项的更多详细信息,请参阅锁定模式(Java EE 教程)。
这种锁定机制的示例应用:Liquibase 的DATABASECHANGELOGLOCK
表,记录在这里。
推荐阅读
- javascript - 如何在此示例中减少 JS 代码,同时保持相同的结果
- python - 无法打开包含文件:'mysql.h':没有这样的文件或目录
- sql - 如何在 SQL Server 中查找零值和负值
- typescript - 如何将类导出为只读但启用内部修改?
- database - 在 MongoDB 中,为什么非因果一致会话中的次要读取关注“可用”默认选项?
- jenkins - 从快照重新创建后,两个数字海洋水滴(Jenkins 和 App)之间的密钥对设置是否仍然有效?
- ruby-on-rails - 与自定义范围关联
- flutter - 使列表项相对于 Flutter 中的日期显示
- linux - yarn logs + blk_xxxxxx_xxxxxx 不存在或不在建设中
- css - 如何更改 matinput 占位符的颜色?