以下就对两种定时任务框架进行简单说明。
github地址:>
前段时间跟踪 MyBatis 源码,分析 MyBatis 的分页查询结果后,发现传入的 IPage 参数结果已经包含了查询数据了,以为分页查询语句的关键在于第一个入参必须是 IPage ,而不需要返回值了呢。
昨天发现不是这么回事儿,本文再回顾一下 MyBatis 分页插件的用法及三个发现:
本文讲解答上面三个问题。
第一步 ,设置分页查询插件。
第二步 ,编写分页查询 DAO 方法:
该方法执行完成后,查询数据会存储到 iPage 参数中,可以直接获取方法返回值。值得注意的是,这个方法必须有返回值。
我最初以为,查询结果都存储到参数中了,是不是方法定义中可以不用返回值了。昨天编码时就随手写成这样了:
结果,执行报 了 SQL 异常:
纳闷了半天,这分页查询怎么就变成了单条查询了呢?对比旧项目代码,还原分页查询方法,正常了。
结论 :MyBatisPlus 分页方法返回值必须是 IPage ,不能为 void 。
以往页面的分页查询,每页数据都很少,没有发现这个问题。
这次实现的是一个批处理任务,一次处理的数据要尽量大。 iPage 分页参数 size 初始设置为 1000,发现日志输出的记录数总是 500 条 ,分页参数失效了,为何呢?
使用客户端连接数据库查询,一次能取 1000 条,而 MyBatisPlus 分页查询,这个 500 条是谁控制的呢?能否修改呢?
答案是 : PaginationInterceptor 限制了单页条数 500,如果需要,可以这样修改:
业务要求某个任务设计成多机、并行任务,且要保证数据一致。Quartz 框架的分布式任务只能保证任务被一个节点执行,不符合需求,Spring Task 倒是可以实现。
所以问题就变成分布式锁的设计了,参考 Quartz 的集群方案中的锁机制,实现基于数据库行锁的锁。
没测试基于行锁的分布式锁之前,我以为某个事务执行 select for update 之后,其他事务再对相同记录执行该 *** 作的话,应该会报异常,导致锁获取失败。
测试发现,某条记录被锁定之后,交互流程大概是这样的:
结论 :数据库记录的行锁是排他的,其他事务会阻塞等待。
辛丑年腊月二十八,上述就是今年最后一个工作日的总结。
收拾收拾,准备迎接农历新年!
引用 11 楼 zhujiazhi 的回复:貌似把那个timer弄成静态变量,在全局里面hold住就不会被回收了 引用 6 楼 方法内写如下代码:SystemTimersTimer objTimer = new SystemTimersTimer();objTimerInterval = 时间; //这个时
主要有三个核心概念:调度器、任务和触发器。
三者关系简单来说就是,调度器负责调度各个任务,到了某个时刻或者过了一定时间,触发器触动了,特定任务便启动执行。概念相对应的类和接口有:
1)JobDetail:望文生义就是描述任务的相关情况;
2)Trigger:描述出发Job执行的时间触发规则。有SimpleTrigger和CronTrigger两个子类代表两种方式,一种是每隔多少分钟小时执行,则用SimpleTrigger;另一种是日历相关的重复时间间隔,如每天凌晨,每周星期一运行的话,通过Cron表达式便可定义出复杂的调度方案。
3)Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail要注册到Scheduler中才会生效,也就是让调度器知道有哪些触发器和任务,才能进行按规则进行调度任务。
以上就是关于定时任务框架选型Quartz/Xxl全部的内容,包括:定时任务框架选型Quartz/Xxl、spring配置quartz后怎么访问数据库、MyBatisPlus 分页插件和数据库行锁的几点思考等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)