日常开发中,尽可能的需要避免长连接的业务代码出现,但是通常定时任务常常会被用来解决长连接业务。大多数定时任务设定在夜晚执行,为了不影响白天的业务和人员操作。
长连接的定时任务也面临一个问题,数据库的session失效时间以及随着业务长期维护,数据量增加的情况导致预定的定时任务无法完成执行的情况。比如预定凌晨4:00执行一个定时任务,预计1个小时处理完毕,正常执行的时候也的确是凌晨5:00左右完成,但随着数据量的翻倍,查询,计算,更新数据的时间延长,可能照成6:00该任务仍旧在执行。如果当前行数据,被用户同时操作,会引发数据库锁表和用户等待。
如何尽可能缩短定时任务(长连接)执行时间,这是一个问题!
减少数据量
1、分批处理:如果一个定时任务已月度执行,拆分到天进行分批处理。每天的定时任务,均摊到每时每刻。
2、多线程并行处理,需要考虑并发问题以及服务器与数据库能力。
3、排除不必要的输入参数,已执行定时任务不再处理,只处理增量数据。同一份数据,减少重复计算。
优化代码
1、增加缓存数据,配置性数据静态化
2、减少IO次数,批量更新数据
3、增加事务,单次执行过程中,执行sql后需立即提交更新。
4、优化循环代码,大循环放在最里面一层
5、多线程处理,需要考虑并发问题以及服务器与数据库能力。
优化数据库表,减少IO时间
1、数据库增加索引
2、大数据量分库分表