注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock:  

2010-01-14 19:24:36|  分类: Spring |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: - 和申 - 和申的个人主页

就在今天,在项目中配置spring-quartz定时任务的时候,出现了一个以前没有遇到过的错误:

ERROR [org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:205)] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in ServletContext resource [/WEB-INF/classes/spring-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: table or view does not exist

这是一个很奇怪的错误,从打印的异常信息可以看出:quartz试图将任务执行情况持久化到数据库中(一般是在集群环境中使用的一种同步任务的方法,保证某一时刻集群中只有一台机器执行定时任务,当然,这不是很优雅,有悖于集群的思想)。

但是,令我奇怪的是,第一,我没有配置quartz的数据源信息;第二,我也没有配置quartz的cluster,quartz应该是在内存中维护任务列表才对。

于是看了看spring与quartz相关的文档,试图在schedulerfactorybean的声明中加上这么一段,来强制quartz不使用数据库而是在内存中:

<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.class">
org.quartz.simpl.RAMJobStore
</prop>
</props>
</property>

发现还是不行,问题依旧。再看看SchedulerFactoryBean的doc,一股怒火直冲上来。doc里setDataSource方法这么写的:

Set the default DataSource to be used by the Scheduler. If set, this will override corresponding settings in Quartz properties.

意思是,如果你为它设置了数据源,那么它会覆盖quartz配置文件中相应的属性。

不过我的配置没有给它添加数据源啊!后来仔细一想,之前曾经遇到过,在spring的bean的自动装配为autodetect时,spring有过不知道将两个map中的哪一个注射到某bean中(实际情况是,那个map不需注入,只不过autodetect了,spring自作聪明了),后来通过自动装配的byName解决问题。原来又是自动装配惹的祸了,很遗憾的,我的项目里的数据源的声明恰好叫做"dataSource",又被spring自作主张的注射到SchedulerFactoryBean里面了,霸道,太霸道了。

没办法,改datasource的名字不太合适,只好把SchedulerFactoryBean的autowire改为no,问题解决。

题外话,cy有一篇文章,指出spring的autodetect装配属性效率相当低下。参见《Webwork2的Action使用Spring的default-autowire prototype­获取的性能对比

========================================================================================
========================================================================================

java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
很明显是版本问题错误,要使用最新的commons-collections-3.1.jar包。同时checkstyle-all.jar包有相同的类,但是这个同名类版本是2.0的,所以必须去除checkstyle-all.jar下面的集合类。
2. 2008-3-24在Spring配置和Quartz集成内容时,有两点需要注意:
(一):在<Beans>中不能够设置default-lazy-init="true",否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。一般项目有多个spring的配置文件,只要当前配置quartz的文件不设置default-lazy-init="true"就可以了。
(二):在<Beans>中不能够设置default-autowire="byName"的属性,必须去掉,否则后台会报table or view does not exist错误,这就是autowire自动装配引起的。表示quartz会使用数据库记录job的状态而进行维护,但是这些日志表又不存在,从而引发错误。autowire自动装配会自动调用dataSource这个bean(hibernate配置的这个bean),但是数据库中又没有相应记录job的表,这就是报这个错误的原因。一般项目有多个spring的配置文件,只要当前配置quartz的文件不设置default-autowire="byName"就可以了。

org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: - 和申 - 和申的个人主页 org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: - 和申 - 和申的个人主页 org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: - 和申 - 和申的个人主页

org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: - 和申 - 和申的个人主页 

  评论这张
 
阅读(3269)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016