quartz 集群使用oracle数据库,出现死锁

xiaoxin 发布于 2013/05/16 14:57
阅读 2K+
收藏 2

如题:

org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00060: 等待资源时检测到死锁
 [See nested exception: java.sql.SQLException: ORA-00060: 等待资源时检测到死锁
]
        at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.obtainLock(StdRowLockSemaphore.java:155)
        at org.quartz.impl.jdbcjobstore.JobStoreTX.doCheckin(JobStoreTX.java:1386)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.manage(JobStoreSupport.java:2378)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.run(JobStoreSupport.java:2409)
* Nested Exception (Underlying Cause) ---------------
java.sql.SQLException: ORA-00060: 等待资源时检测到死锁

        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799)
        at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1037)
        at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1132)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3316)
        at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3361)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
        at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.obtainLock(StdRowLockSemaphore.java:137)
        at org.quartz.impl.jdbcjobstore.JobStoreTX.doCheckin(JobStoreTX.java:1386)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.manage(JobStoreSupport.java:2378)
        at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.run(JobStoreSupport.java:2409)

连接此数据库的客户端共有20个weblogic 逻辑server 同时连接 ,定时任务是每两钟执行一次,此问题今天上午10点左右出现,下点2点发现的,影响了一批任务,目前将其中2个server的数据库进行了更新,任务恢复正常处理,剩下的server目前因为是生产服务器,还不敢重启。

注:重启的2台server更新数据库的原因,是单独启动这两台,死在了“[org.quartz.core.QuartzScheduler.setJobFactory(QuartzScheduler.java:1853)] - JobFactory set to: org.s
pringframework.scheduling.quartz.AdaptableJobFactory@4e33e7”这一行就不动了。


此问题如何解决 ,请高手解答,另外,启动的两台server目前连接的是测试库,此方法也只是江湖救急,现在也不能保证将所有的server重启后能解决问题。

加载中
0
xiaoxin
xiaoxin

谁来帮帮我啊


nubo
nubo
去查oracle的trace文件,看是什么sql造成了死锁。
0
nubo
nubo
真正该查的是: ORA-00060
0
肥熊哥哥
肥熊哥哥
先检查一下对数据库操作部分的程序是不是有问题。如果单纯地进行这种定时任务,是不会发生死锁的情况。
0
xiaoxin
xiaoxin

引用来自“肥熊哥哥”的答案

先检查一下对数据库操作部分的程序是不是有问题。如果单纯地进行这种定时任务,是不会发生死锁的情况。

quartz单机是用不到数据库的,只能集群才需要用到数据库,之前8个server是没发生过死锁的,目前增加到12+才出现的死锁,目前将所有的server都重启后,恢复正常,不过具体是什么原因,还不清楚。

发生死锁的表是quzrtz用的表,跟自行开发的程序无关,是quzrtz开源组件发生的,所以现在排查问题比较困难,谢谢!

0
sol.tao
sol.tao
   UPDATE QRTZ_TRIGGERS SET

TRIGGER_STATE = ? WHERE JOB_NAME = ? AND JOB_GROUP = ? AND TRIGGER_STATE = ?我也遇到了

0
xiaoxin
xiaoxin

引用来自“sol.tao”的答案

   UPDATE QRTZ_TRIGGERS SET

TRIGGER_STATE = ? WHERE JOB_NAME = ? AND JOB_GROUP = ? AND TRIGGER_STATE = ?我也遇到了

解决了吗,截止到目前,出现过两次,都是通过 重启server解决.
0
sol.tao
sol.tao
这个主要是要搓开job处理的时间,将定点job和细粒度执行job搓开执行。
X
Xue_Yang_
怎么解决...
返回顶部
顶部