Quartz数据库表分析【面试+工作】

前言

Quartz默认提供了11张表,本文将对这几张表做简要的分析。

表信息

共11张表,前6张都是关于各种triggers的信息,后面包括job,悲观锁,调度状态等信息;相关表操作在类StdJDBCDelegate中,相关sql语句在StdJDBCConstants中;

1.qrtz_blob_triggers

自定义的triggers使用blog类型进行存储,非自定义的triggers不会存放在此表中,Quartz提供的triggers包括:CronTrigger,CalendarIntervalTrigger,

DailyTimeIntervalTrigger以及SimpleTrigger,这几个trigger信息会保存在后面的几张表中;

2.qrtz_cron_triggers

存储CronTrigger,这也是我们使用最多的触发器,在配置文件中做如下配置,即可在qrtz_cron_triggers生成记录:

表达式指定了每隔6秒执行一次,然后指定了要执行的task,task指定了要执行的业务,运行之后可以查看数据表:

myScheduler是在定义SchedulerFactoryBean时指定的名称,其他字段都可以在上面的配置中找到;

3.qrtz_simple_triggers

存储SimpleTrigger,在配置文件中做如下配置,即可在qrtz_simple_triggers生成记录:

指定了开始延迟时间,重复间隔时间已经重复的次数限制,查看表如下:

TIMES_TRIGGERED用来记录执行了多少次了,此值被定义在SimpleTriggerImpl中,每次执行+1,这里定义的REPEAT_COUNT=5,实际情况会执行6次,具体可以查看SimpleTriggerImpl源码:

timesTriggered默认值为0,当timesTriggered > repeatCount停止trigger,所以会执行6次,当执行完毕之后此记录会被删除;

4.qrtz_simprop_triggers

存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器,使用CalendarIntervalTrigger做如下配置:

CalendarIntervalTrigger没有对应的FactoryBean,直接设置实现类CalendarIntervalTriggerImpl;指定的重复周期是1,默认单位是天,也就是每天执行一次,查看表如下:

提供了3个string类型的参数,2个int类型的参数,2个long类型的参数,2个decimal类型的参数以及2个boolean类型的参数;具体每个参数是什么含义,根据不同的trigger类型存放各自的参数;

5.qrtz_fired_triggers

存储已经触发的trigger相关信息,trigger随着时间的推移状态发生变化,直到最后trigger执行完成,从表中被删除;已SimpleTrigger为例重复3次执行,查询表:

相同的trigger和task,每触发一次都会创建一个实例;从刚被创建的ACQUIRED状态,到EXECUTING状态,最后执行完从数据库中删除;

6.qrtz_triggers

存储定义的trigger,以上定义的三个triggers为例,分别是:firstSimpleTrigger,firstCalendarTrigger和firstCronTrigger,运行之后查看数据库:

和qrtz_fired_triggers存放的不一样,不管trigger触发了多少次都只有一条记录,TRIGGER_STATE用来标识当前trigger的状态;firstCalendarTask每天执行一次,执行完之后一直是WAITING状态;firstCronTrigger每6秒执行一次状态是ACQUIRED状态;firstSimpleTrigger重复执行6次后状态为COMPLETE,并且会被删除;

7.qrtz_job_details

存储jobDetails信息,相关信息在定义的时候指定,如上面定义的JobDetailFactoryBean,查询数据库:

JOB_DATA存放的就是定义task时指定的jobDataMap属性,所以此属性需要实现Serializable接口,方便持久化到数据库;

8.qrtz_calendars

Quartz为我们提供了日历的功能,可以自己定义一个时间段,可以控制触发器在这个时间段内触发或者不触发;现在提供6种类型:AnnualCalendar,CronCalendar,DailyCalendar,HolidayCalendar,MonthlyCalendar,WeeklyCalendar;以下使用CronCalendar为例:

定义了一个排除每隔5秒的CronCalendar,然后在firstCronTrigger中指定了calendarName,并且需要在SchedulerFactoryBean中定义calendars;因为firstCronTrigger每6秒执行一次,而CronCalendar排除每隔5秒,所以会出现firstCronTrigger在第5次触发的时候需要等待12秒,结果如下:

查询保存在数据中的CronCalendar:

CALENDAR存放的是CronCalendar序列化之后的数据;

9.qrtz_paused_trigger_grps

存放暂停掉的触发器,测试手动暂停firstCronTrigger,代码如下:

启动之后延迟4秒后暂停firstCronTrigger,这里传递的参数group,然后查看数据库:

因为已经入库,所以重启之后firstCronGroup还是处于暂停状态,firstCronTrigger不会运行;

10.qrtz_scheduler_state

存储所有节点的scheduler,会定期检查scheduler是否失效,启动多个scheduler,查询数据库:

记录了最后最新的检查时间,在quartz.properties中设置了CHECKIN_INTERVAL为1000,也就是每秒检查一次;

11.qrtz_locks

Quartz提供的锁表,为多个节点调度提供分布式锁,实现分布式调度,默认有2个锁:

STATE_ACCESS主要用在scheduler定期检查是否失效的时候,保证只有一个节点去处理已经失效的scheduler;

TRIGGER_ACCESS主要用在TRIGGER被调度的时候,保证只有一个节点去执行调度;

总结

本文对这11张表做了简要的分析,介绍了每张表具体是用来存储什么的,并且给了简单的实例;其实如果要实现一个trigger的管理系统,其实也就是对这几张表的维护。

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

电子商务系统ShopNC多个漏洞(可暴力 getshell)

前言 ShopNC是一款S是网城创想公司旗下服务于企业客户的电子商务系统,基于PHP5技术采用MVC 模式开发,本文介绍了shopnc多个漏洞结合,可getsh...

3037
来自专栏程序你好

如何在SQL Server中将表从一个数据库复制到另一个数据库

1774
来自专栏Laoqi's Linux运维专列

配置zabbix架构

4177
来自专栏Linux运维学习之路

MySQL体系结构及多实例

MySQL客户端和服务器端模型 MySQL是一个典型C/S,服务器端与客户端两部分组成 服务器端程序  mysqld mysql自带的客户端(mysql mys...

37312
来自专栏专业duilib使用+业余界面开发

duilib将资源文件压缩成zip并打包到exe的资源中

2843
来自专栏PHP在线

MySQL事务隔离级别详解

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销...

3897
来自专栏醉生梦死

MySQL日志管理工具 mysqlbinlog

 [root@db02 data]# mysqlbinlog mysql_bin.000001

7002
来自专栏程序员互动联盟

【编程基础】Windows下如何玩转串口编程

问题:有朋友在群里问Windows下如何给单片机发送或者接收数据。 ? 在windows下,各种外设都被看成文件,这个跟Linux下看成设备节点类似,所以串...

3715
来自专栏IT探索

linux下bin安装mysql的问题

“mysqld_safe mysqld from pid file /usr/local/mysql/data/localhost.localdomain.pi...

652
来自专栏龙首琴剑庐

数据库的事务作用及隔离级别

1、事务是什么? 实际的SQL执行过程中,有时候我们生产过程需要保证某些SQL要么一起并顺序执行成功,要么一起失败回滚,不做任何操作。那么就有了事务的概念。事务...

3046

扫码关注云+社区

领取腾讯云代金券