【问题标题】:Quartz scheduler deadlock on creating triggers/jobs in qrtz tables在 qrtz 表中创建触发器/作业时 Quartz 调度程序死锁
【发布时间】:2011-08-01 19:10:00
【问题描述】:

我正在为预定的时间创建一个主 cronjob,从该作业开始,我会毫不拖延地创建 10 个 simpletrigger 作业,并且为每个 simpletriger 作业创建另一组 100 个作业。

我正在使用 spring,我的线程池大小是 30,我正在使用 h2 数据库、JobStoreTX、StdJDBCDelegate 进行数据库连接。我的应用程序是一个独立的 java 程序,它启动主要工作。

它在 qrtz 表中创建了第一组 jobdetail/触发器详细信息。当它执行第一个跨越子作业的简单作业时,会在触发器和作业条目上获得表锁。

可能是什么问题?

例外是: “原因:org.h2.jdbc.JdbcSQLException:检测到死锁。当前事务已回滚。详细信息:” 会话 #64(用户:SA)正在等待锁定 PUBLIC.QRTZ_SIMPLE_TRIGGERS,同时锁定 PUBLIC.QRTZ_TRIGGERS(独占)。 会话 #67(用户:SA)正在等待锁定 PUBLIC.QRTZ_TRIGGERS,同时锁定 PUBLIC.QRTZ_SIMPLE_TRIGGERS(独占)。”;SQL 语句: 插入到 qrtz_SIMPLE_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP,REPEAT_COUNT,REPEAT_INTERVAL,TIMES_TRIGGERED)值(?,?,?,?,?)[40001-132] 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:316) 在 org.h2.message.DbException.get(DbException.java:167) 在 org.h2.message.DbException.get(DbException.java:144) 在 org.h2.table.RegularTable.doLock(RegularTable.java:435) 在 org.h2.table.RegularTable.lock(RegularTable.java:382)"

【问题讨论】:

  • 有问题将并发触发器和作业,主触发器将在其子触发器和作业完成其任务之前完成。另一个问题,如果我在石英中的线程池计数为 30,这意味着我应该有池中只有 30 个作业,还是表示正在运行的作业数?

标签: spring scheduled-tasks scheduling quartz-scheduler


【解决方案1】:

您是否使用 H2 的 mvcc 模式 - 这是启用行锁定而不是表锁定所必需的(据我所知)? (很像使用和不使用 InnoDB 的 MySQL 之间的区别)。

http://jira.opensymphony.com/browse/QUARTZ-773

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多