當(dāng)多個weblogic節(jié)點發(fā)布時,定時框架采用的是SELECT * FROM SP_QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE獲取鎖的形式,當(dāng)能鎖住記錄則執(zhí)行定時任務(wù)。多個節(jié)點執(zhí)行會產(chǎn)生大量的行鎖。為了解決這個問題SELECT * FROM SP_QRTZ_LOCKS WHERE LOCK_NAME = :1 FOR UPDATE NOWAIT ,可以解決鎖的問題,但會導(dǎo)致任務(wù)出錯退出。最后通過SELECT * FROM {0}LOCKS UPDLOCK WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE SKIP LOCKED 可完美解決。
quartz: properties: org: quartz: scheduler: #實例名稱,缺省QuartzScheduler instanceName: myScheduler instanceId: AUTO jobStore: class: org.quartz.impl.jdbcjobstore.JobStoreTX # Driver代理 driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate #表前綴 tablePrefix: QRTZ_ isClustered: false clusterCheckinInterval: 10000 useProperties: false ##################################################################### #在LOCKS表中選擇一行,然后在這一行放一把鎖。默認(rèn)為“SELECT * FROM #{0}LOCKS WHERE SCHED_NAME ={1} AND LOCK_NAME = ? FOR UPDATE”, #這對于大多數(shù)數(shù)據(jù)庫都適用?!?#123;0}”由上面的配置的TABLE_PREFIX在運行 #時替換,而“{1}”由scheduler的名字替換。 ##################################################################### selectWithLockSQL : SELECT * FROM {0}LOCKS UPDLOCK WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE SKIP LOCKED threadPool: class: org.quartz.simpl.SimpleThreadPool threadCount: 10 threadPriority: 5 threadsInheritContextClassLoaderOfInitializingThread: true job-store-type: jdbc