Quartz在QRTZ_JOB_DETAILS表中存储了什么

  • 1.QRTZ_JOB_DETAIL表
  • 2. StdJDBCDelegate

因为本文章是说明Quartz在QRTZ_JOB_DETAILS表中存储了什么的,所以本篇文章的前提是quartz的配置中是使用了jdbcjobstore的,并且driver代理这里我们使用的是StdJDBCDelegate。

1.QRTZ_JOB_DETAIL表

这张表是quartz存储job的表,按字面意思这些字段分别为

SCHED_NAME:计划名字
JOB_NAME:工作名字
JOB_GROUP:工作组
DESCRIPTION:描述
JOB_CLASS_NAME:工作类名字
IS_DURABLE:是否持久化
IS_NONCONCURRENT:是否同步
IS_UPDATE_DATA:是否更新数据
REQUESTS_RECOVERY:是否要求唤醒
JOB_DATA:job数据

现在我们了解了这些字段的名字,但是我们不知到这些字段里面有什么。所以接下来我们要去了解一下quartz在这些字段中存储了什么。

2. StdJDBCDelegate

/*** <p>* Insert the job detail record.* </p>* * @param conn*          the DB Connection* @param job*          the job to insert* @return number of rows inserted* @throws IOException*           if there were problems serializing the JobDataMap*/public int insertJobDetail(Connection conn, JobDetail job)throws IOException, SQLException {ByteArrayOutputStream baos = serializeJobData(job.getJobDataMap());PreparedStatement ps = null;int insertResult = 0;try {ps = conn.prepareStatement(rtp(INSERT_JOB_DETAIL));ps.setString(1, job.getKey().getName());ps.setString(2, job.getKey().getGroup());ps.setString(3, job.getDescription());ps.setString(4, job.getJobClass().getName());setBoolean(ps, 5, job.isDurable());setBoolean(ps, 6, job.isConcurrentExectionDisallowed());setBoolean(ps, 7, job.isPersistJobDataAfterExecution());setBoolean(ps, 8, job.requestsRecovery());setBytes(ps, 9, baos);insertResult = ps.executeUpdate();} finally {closeStatement(ps);}return insertResult;}

这是我从quartz的源码StdJDBCDelegate类中发现的,因为我们的driver代理用的就是StdJDBCDelegate,所以往数据库中插入job的应该就是这个方法。
其中我们可以发现,QRTZ_JOB_DETAIL表中的大部分字段都可以在这里找到,除了SCHED_NAME和JOB_DATA字段没有其他都有了,那这两个字段都是存了什么呢?
接下来我们打开插入job的sql语句看看(点击PreparedStatement方法中的参数就可以看到):

String INSERT_JOB_DETAIL = "INSERT INTO "+ TABLE_PREFIX_SUBST + TABLE_JOB_DETAILS + " (" + COL_SCHEDULER_NAME + ", " + COL_JOB_NAME+ ", " + COL_JOB_GROUP + ", " + COL_DESCRIPTION + ", "+ COL_JOB_CLASS + ", " + COL_IS_DURABLE + ", " + COL_IS_NONCONCURRENT +  ", " + COL_IS_UPDATE_DATA + ", " + COL_REQUESTS_RECOVERY + ", "+ COL_JOB_DATAMAP + ") " + " VALUES(" + SCHED_NAME_SUBST + ", ?, ?, ?, ?, ?, ?, ?, ?, ?)";

这里我们发现SCHED_NAME字段的内容是已经在sql中预设好的与job没有什么关联,所以这里我们不去深究。接下来是JOB_DATA字段里面是什么呢?让我们回到原先的insertJobDetail方法中,在执行语句前有一个setBytes方法,其中有两个参数一个是9,另一个是job的jobDataMap的输出流。QRTZ_JOB_DETAIL表中有10个字段,去掉SCHED_NAME,还剩9个,所以我们可以推断出JOB_DATA字段中存储的就是jobDataMap里面的数据。
其他8个字段中JOB_NAME和JOB_GROUP我就不说了,大家应该可以知道是什么。其他6个字段我们一一点进JobDetai类中看看是什么。

这里我是翻译的英文注释
DESCRIPTION:返回对创建者对job实例的描述(如果有的话)。所以显而易见,这个属性对job没什么大用,他只是类似于对这个job实例的注释而已。
JOB_CLASS_NAME:获得将要执行的job实例(这里的注释讲的不是很明白,但是根据代码我们可以知道,个字段存储的是当前我们实现的job类的包路径)
IS_DURABLE:job完成后(没有trigger指向他)是否要保留数据库记录
IS_NONCONCURRENT:关联的job类是否有DisallowConcurrentExecution注解,被标注的job类不能同时执行多个实例
IS_UPDATE_DATA:关联的job类是否有DisallowConcurrentExecution注解,被标注的job类在执行期间会更新jobDataMap中的数据,并且将更新后的jobDataMap数据重新储存到数据库
REQUESTS_RECOVERY:在当前job尚未执行时,当前quartz节点在宕机重启或者故障转移后是否还要执行该job。

至此说明完毕,仅代表个人观点,如有疑问可以在评论区回复。

Quartz在QRTZ_JOB_DETAILS表中存储了什么相关推荐

  1. SQL表中存储计算公式,直接执行

    这个题目有点绕口啊,其实这个需求也是在论坛里发现的,觉得挺有意思,记录一下.论坛帖子地址:https://bbs.csdn.net/topics/392480285 就是一个表中几个字段,其中一个字段 ...

  2. oracle表分区--亿级的数据在oracle表中存储,表分区的一个真实应用场景

    我从来没有操作处理过如此大量的真实数据. 我的一个任务,通过kafka流式处理消息框架 消费 整个城市 其中一种手机网络的信号接入信息. 千万级人口,只要有人使用手机网络,就会产生一条数据,可想而知, ...

  3. mysql 存储guid_我应该如何在MySQL表中存储GUID?

    应该调整由KCD发布的GuidToBinary例程,以考虑GUIDstring中时间戳的位布局. 如果string表示版本1 UUID,就像uuid()mysql例程所返回的那样,那么时间分量被emb ...

  4. java保存的时候保存多张表,表驱动,如何在表中存储一个方法

    如果需要使用表来维护的数据,都是很少有变动,并且很重要的数据.因为查表的速度肯定不如直接执行代码来得快.如果用代码解决,你可以使用: 1.if...else 2.switch... 3.enum..枚 ...

  5. SAP 金额在表中的存储及货币转换因子

    场景:一个接口出问题了,SAP通过RFC将SO数据传输到Java系统,错误的将100日元传为1.00日元. 其实查看SAP透明表发现,表中存储的的确是1.00,是前台真实数据的1/100,开发接口时没 ...

  6. oracle查看表和索引碎片,Oracle 表空间索引存储与碎片检查

    Oracle 表空间索引存储与碎片检查 Oracle 表空间索引存储检查,Oracle 表空间索引碎片查看,包括查看系统表中的用户索引.索引的存储情况检查.索引的选择性.确定索引的实际碎片. 1.查看 ...

  7. 关于SQL 数据库表中的聚集索引和非聚集索引等

    原文地址:http://www.cppblog.com/zuoyinbo/archive/2008/06/03/52075.html          1.概念          索引是在数据库表或者 ...

  8. 数据库中存储用户名、密码时如何处理?

    一般的项目都有一个用户表,请问在这个表中,你的账号和密码都是明文存储的么?那么怎么防止被别人看见用户的密码呢? 我见过一个项目是这样的,在用户注册时就对用户的密码进行MD5加密,这样用户表中存储的密码 ...

  9. mysql创建四张表 分别存储 学生信息 课程信息 分数表 教师信息表

    学生信息表 Student 字段名 字段类型 字段约束 / 含义 Sno Varchar(3) Not null / 学员编号 Sname Varchar(4) Not null / 学员姓名 Sse ...

  10. Visual FoxPro初学:建立数据库,创建表,向表中添加数据

    一.怎样建立数据库 建立数据库的方法有很多.用菜单建立数据库的步骤如下: 1.单击"文件(F)"."新建(N)-"; 2.选择"数据库"文件 ...

最新文章

  1. map mybatis 的字段返回0_Mybatis 你踩过坑吗?
  2. pytorch查看应用指数衰减后的学习率
  3. python实现范围框跟随_调整边界框的大小和位置,同时使其稍微居中
  4. python中文文本处理_python简单文本处理的方法
  5. Flink 1.7 文档翻译活动期待大家的参与 | ApacheCN
  6. solr课程学习系列-solr的概念与结构(1)
  7. dwr例外被抛出且未被接住
  8. 团体程序设计天梯赛-练习集——7-9 打印学生选课清单 (25分)
  9. 为何最简单的破坏命令通过了众多杀软
  10. 如何批量将JPG图片转换成BMP格式?
  11. python小明爬楼梯_Python两种方法求解登楼梯问题(京东2016笔试题)
  12. ajax authorization,ajax跨域,_ajax Authorization 鉴权失败,ajax跨域 - phpStudy
  13. matlab mse mae,回归评价指标MSE、RMSE、MAE、R-Squared
  14. 忘记teamviewer密码怎么办?
  15. 2411681-90-6,Thalidomide-O-amido-PEG4-propargyl它结合了基于沙利度胺的cereblon配体和用于PROTAC技术的PEG4连接剂
  16. 一文教你看懂Fama-French三因子模型
  17. OC学习----设计模式
  18. php日历排班表,排班表 : 轮班工作者必备的排班神器
  19. VC++获取系统当前时间并显示
  20. Windows 10下视频播放器泛黄,颜色太暖、太亮

热门文章

  1. GOBY--一款攻击面测绘工具的使用
  2. MFC导入图标文件的方法
  3. 【selenium】126官网邮箱登录
  4. WPF - Visual调试工具Snoop
  5. 什么是手机定位,手机定位在生活中带来哪些作用
  6. 阳离子型含糖水凝胶的合成
  7. 服务器装系统03系统,windows server 2003 服务器安装教程完整版
  8. 糗百文化:糗事百科的运营哲学
  9. java的封装 继承 多态_java继承多态是什么意思?java封装继承多态的例子
  10. 三维坐标系旋转的顺时针_逆时针问题