今天在一个新的项目中用Spring集成Quartz来进行任务调度,和以往一样,配置好JobDetail、Trigger、SchedulerFactoryBean启动,却遭遇到如下异常信息:
这是一个很奇怪的错误,从打印的异常信息可以看出:quartz试图将任务执行情况持久化到数据库中,一般是在集群环境中使用的一种同步任务的方法,保证某一时刻集群中只有一台机器执行定时任务。
但是,令我奇怪的是,第一,我没有配置quartz的数据源信息;第二,我也没有配置quartz的cluster,quartz应该是在内存中维护任务列表才对。因为我们根本就没有自定义quartz.properties。
从日志上看,这的确是Quartz抛出来的异常,而且就是SchedulerFactoryBean.createScheduler时出现了问题;直接查看SchedulerFactoryBean的源码,惊奇的发现了dataSource这个属性!!而且在setDataSource方法注释里面说明了该属性将覆盖quartz.properties文件配置的datasource;看到这个属性就一切都明了了,原来又是Spring的自动注入惹的祸!前段时间刚刚遭遇过同类事件,具体可参见《
网店版重生系列:都是Spring配置中自动注入惹的祸
》;
一般情况下我们数据源的beanId都是dataSource,所以在Spring自动注入的情况下,Spring再一次自作聪明了一把!解决办法有二:其一,取消quartz任务相关配置所在bean的自动注入,注意:无需将所有Spring配置文件中的自动注入都去西欧啊;其二:将系统数据源datasource这个beanId进行改名;
spring
-boot 整合
quartz
的
时
候,连接windows的mysql的
时
候好好的,然而用linux上的mysql的
时
候,启动就报了这个错:
Failu
re
obta
ini
ng
db
row
lock
:
Table
‘test.QRTZ_
LOCK
S’ doesn’t exist
首先用windows的mysql是没问题的。
其实linux的mysql也是有这个表的,但由于是从windows复制过去的,所以表名都是小写的,而
quartz
启动的
时
候找的是大写,所以认为test.QRTZ
1.1何为锁
锁在现实
中
的意义为:封闭的器物,以钥匙或暗码开启。在计算机
中
的锁一般用来管理对共享资源的并发访问,比如我们java同学熟悉的
Lock
,synchronized等都是我们常见的锁。当然在我们的数据库
中
也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一。
1.2为什么要懂数据库锁?
通常来说对于一般的开发人员,在使用数据库的
时
候一般懂点DQL(select),DML...
部署后端项目的
时
候遇到
Failu
re
obta
ini
ng
db
row
lock
:
Table
‘XXX.qrtz_
LOCK
S‘ doesn‘t exist,百思不得其解,一开始以为是数据库版本问题,后来经过测试不是版本问题,于是乎查阅资料发现是mysql对表大小写有要求,但是当
时
创建表的
时
候都是小写,所以说就查不到qrtz_
LOCK
S这张表,所以就报错了,知道问题了就好解决了。
解决办法:
1. ~~删除掉所有的qrtz表,重新创建以大写命名的表~~
2. 找到mysql的配置文件 my.cnf 路径在e
当在IDEA
中
配置了云服务器的MySQL
Caused by: org.
quartz
.impl.j
db
cjobstore.
Lock
Exception
:
Failu
re
obta
ini
ng
db
row
lock
:
Table
'amops.QRTZ_
LOCK
S' doesn't exist
因为在Linux平台下面MySQL默认是严格区分大小写的,需要去修改MySQL的配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
在mysqld下添加以下内容
lower
当在IDEA
中
配置了云服务器的MySQL
Caused by: org.
quartz
.impl.j
db
cjobstore.
Lock
Exception
:
Failu
re
obta
ini
ng
db
row
lock
:
Table
'amops.QRTZ_
LOCK
S' doesn't exist
因为在Linux平台下面MySQL默认是严格区分大小写的,需要去修改MySQL的配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
在mysqld下添加以下内容
org.
quartz
.impl.j
db
cjobstore.
Lock
Exception
:
Failu
re
obta
ini
ng
db
row
lock
:
Table
‘india_framework.QR
将Windows上的mysql数据迁移到Linux上后,报这个错:org.
quartz
.impl.j
db
cjobstore.
Lock
Exception
:
Failu
re
obta
ini
ng
db
row
lock
:
Table
'india_framework.QRTZ_
LOCK
S' doesn't exist首先用windows的mysql是没问题的。
其实linux的mysql也是有这个表的,但由于是从windows复制过去的,所以表名都是小写的,而
quartz
启动的
时
候找的是大写,所以认为test.Q
在windows下数据库都运行的好好的,放在Linux 里就报错了!这是因为在Linux下,MySQL的表名区分大小写,而在Windows下是不区分,从Windows下导出的数据脚本
中
使用的是小写,而Hibernate生成的SQL
中
表名是大写的,所以查不出数据。
接下来就是设置MySQL数据库不区分大小写。
我们先查找一下,发现它默认为0是区分大小写的,那么我们就需要设置将其设置为1。
show vari
ab
les like '%lower_case%';
我们可以用如下命令进行设置
1.产生的错误日志
ERROR [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tun
i
ng
)'] (ContextLoader.java:215) - Context
ini
tialization fai
led
org.
spring
framework.beans.factory.BeanCreatio...
org.
quartz
.impl.j
db
cjobstore.
Lock
Exception
:
Failu
re
obta
ini
ng
db
row
lock
:
Table
'aly_uias.qrtz_
LOCK
S' doesn't exist
异常
信息表明:在创建
quartz
自带表
时
,表明是小写的,程序
中
使用的是大写表明,由于mysql数据库...