Quartz在QRTZ_JOB_DETAILS表中存储了什么
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表中存储了什么相关推荐
- SQL表中存储计算公式,直接执行
这个题目有点绕口啊,其实这个需求也是在论坛里发现的,觉得挺有意思,记录一下.论坛帖子地址:https://bbs.csdn.net/topics/392480285 就是一个表中几个字段,其中一个字段 ...
- oracle表分区--亿级的数据在oracle表中存储,表分区的一个真实应用场景
我从来没有操作处理过如此大量的真实数据. 我的一个任务,通过kafka流式处理消息框架 消费 整个城市 其中一种手机网络的信号接入信息. 千万级人口,只要有人使用手机网络,就会产生一条数据,可想而知, ...
- mysql 存储guid_我应该如何在MySQL表中存储GUID?
应该调整由KCD发布的GuidToBinary例程,以考虑GUIDstring中时间戳的位布局. 如果string表示版本1 UUID,就像uuid()mysql例程所返回的那样,那么时间分量被emb ...
- java保存的时候保存多张表,表驱动,如何在表中存储一个方法
如果需要使用表来维护的数据,都是很少有变动,并且很重要的数据.因为查表的速度肯定不如直接执行代码来得快.如果用代码解决,你可以使用: 1.if...else 2.switch... 3.enum..枚 ...
- SAP 金额在表中的存储及货币转换因子
场景:一个接口出问题了,SAP通过RFC将SO数据传输到Java系统,错误的将100日元传为1.00日元. 其实查看SAP透明表发现,表中存储的的确是1.00,是前台真实数据的1/100,开发接口时没 ...
- oracle查看表和索引碎片,Oracle 表空间索引存储与碎片检查
Oracle 表空间索引存储与碎片检查 Oracle 表空间索引存储检查,Oracle 表空间索引碎片查看,包括查看系统表中的用户索引.索引的存储情况检查.索引的选择性.确定索引的实际碎片. 1.查看 ...
- 关于SQL 数据库表中的聚集索引和非聚集索引等
原文地址:http://www.cppblog.com/zuoyinbo/archive/2008/06/03/52075.html 1.概念 索引是在数据库表或者 ...
- 数据库中存储用户名、密码时如何处理?
一般的项目都有一个用户表,请问在这个表中,你的账号和密码都是明文存储的么?那么怎么防止被别人看见用户的密码呢? 我见过一个项目是这样的,在用户注册时就对用户的密码进行MD5加密,这样用户表中存储的密码 ...
- mysql创建四张表 分别存储 学生信息 课程信息 分数表 教师信息表
学生信息表 Student 字段名 字段类型 字段约束 / 含义 Sno Varchar(3) Not null / 学员编号 Sname Varchar(4) Not null / 学员姓名 Sse ...
- Visual FoxPro初学:建立数据库,创建表,向表中添加数据
一.怎样建立数据库 建立数据库的方法有很多.用菜单建立数据库的步骤如下: 1.单击"文件(F)"."新建(N)-"; 2.选择"数据库"文件 ...
最新文章
- map mybatis 的字段返回0_Mybatis 你踩过坑吗?
- pytorch查看应用指数衰减后的学习率
- python实现范围框跟随_调整边界框的大小和位置,同时使其稍微居中
- python中文文本处理_python简单文本处理的方法
- Flink 1.7 文档翻译活动期待大家的参与 | ApacheCN
- solr课程学习系列-solr的概念与结构(1)
- dwr例外被抛出且未被接住
- 团体程序设计天梯赛-练习集——7-9 打印学生选课清单 (25分)
- 为何最简单的破坏命令通过了众多杀软
- 如何批量将JPG图片转换成BMP格式?
- python小明爬楼梯_Python两种方法求解登楼梯问题(京东2016笔试题)
- ajax authorization,ajax跨域,_ajax Authorization 鉴权失败,ajax跨域 - phpStudy
- matlab mse mae,回归评价指标MSE、RMSE、MAE、R-Squared
- 忘记teamviewer密码怎么办?
- 2411681-90-6,Thalidomide-O-amido-PEG4-propargyl它结合了基于沙利度胺的cereblon配体和用于PROTAC技术的PEG4连接剂
- 一文教你看懂Fama-French三因子模型
- OC学习----设计模式
- php日历排班表,排班表 : 轮班工作者必备的排班神器
- VC++获取系统当前时间并显示
- Windows 10下视频播放器泛黄,颜色太暖、太亮