Java 调度时JDBC JobStoreCMT锁定
我使用的是Weblogic+Spring+quartz Quartz配置为使用JobStoreCMT 我注意到JobStoreCMT在调度作业时在quartz表上获得了一个DB锁 下面是JobStoreCMT代码段Java 调度时JDBC JobStoreCMT锁定,java,spring,jdbc,quartz-scheduler,weblogic12c,Java,Spring,Jdbc,Quartz Scheduler,Weblogic12c,我使用的是Weblogic+Spring+quartz Quartz配置为使用JobStoreCMT 我注意到JobStoreCMT在调度作业时在quartz表上获得了一个DB锁 下面是JobStoreCMT代码段 protected Object executeInLock( String lockName, TransactionCallback txCallback) throws JobPersistenceException { boolean
protected Object executeInLock(
String lockName,
TransactionCallback txCallback) throws JobPersistenceException {
boolean transOwner = false;
Connection conn = null;
try {
if (lockName != null) {
// If we aren't using db locks, then delay getting DB connection
// until after aquiring the lock since it isn't needed.
if (getLockHandler().requiresConnection()) {
conn = getConnection();
}
transOwner = getLockHandler().obtainLock(conn, lockName);
}
if (conn == null) {
conn = getConnection();
}
return txCallback.execute(conn);
} finally {
try {
releaseLock(conn, LOCK_TRIGGER_ACCESS, transOwner);
} finally {
cleanupConnection(conn);
}
}
}
在这个方法之后,我在数据库的quartz表中看到了我计划的触发器和作业
我的问题是为什么石英在这个阶段需要锁定DB级
当作业开始执行、完成等时,我会看到需要锁
谢谢我找到了一些解决问题的方法: setLockOnInsert为false,因为默认情况下为true public void setLockOnInsert(布尔型lockOnInsert) 插入新作业/触发器时是否获取锁。默认值为true,这是最安全的-一些数据库(如MS SQLServer)似乎需要这样做以避免在高负载下出现死锁,而其他数据库似乎不需要这样做就可以了。 将此属性设置为false将在添加新作业和触发器期间显著提高性能
+org.quartz.jobStore.acquireTriggersWithinLock我将其设置为false(默认设置),而不是我最初配置的true。同时我发现:setLockOnInsert public void setLockOnInsert(布尔lockOnInsert)在插入新作业/触发器时是否获取锁。默认值为true,这是最安全的-一些数据库(如MS SQLServer)似乎需要这样做以避免在高负载下出现死锁,而其他数据库似乎不需要这样做就可以了。将此属性设置为false将在添加新作业和触发器期间显著提高性能。参数:lockOnInsert-