因项目中有会议,在插入数据时会有根据会议更改会议状态的需求。
解决方案:
1. Java 定时任务
在jdk自带的库中,有两种技术可以实现定时任务。 一种是使用Timer,另外一个则是ScheduledThreadPoolExecutor。
2. 数据库存储过程 + 定时任务
各自的优缺点:
1。Java定时任务
优点:需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。
缺点: Timer底层是使用一个单线来实现多个Timer任务处理的,所有任务都是由同一个线程来调度,所有任务都是串行执行,意味着同一时间只能有一个任务得到执行,而前一个任务的延迟或者异常会影响到之后的任务。
因为Timer中所有的任务都是在一个线程中执行,那么如果有一个定时任务在运行时,产生未处理的异常,那么当前这个线程就会停止,那么所有的定时任务都会停止,受到影响。
2. 数据库存储过程 + 定时任务
优点:代码量少,低延迟,更新结果速度快
缺点:对不熟悉存储过程的人编写不友好
具体解决步骤:
1.Java 定时任务
考虑到效率问题,为对其进行实现
2.数据库定时任务:
1、查看定时策略是否开启
- 查看命令
show variables like '%event_sche%';
- 显示的event_scheduler为OFF时用以下命令开启
set global event_scheduler=1;
- 注意:以上的改法在数据库重启后将会恢复为原来状态,要想数据库重启后也可以让event_scheduler开启,则需要在配置文件my.ini的设置。修改如下,然后重启mysql服务即可。
[mysqld]
event_scheduler=ON //这一行加入mysqld标签下
2 . sql 代码块
CREATE DEFINER=`root`@`%` PROCEDURE `UPDATE_STATUS`()
COMMENT '根据时间更新活动状态"'
BEGIN
#Routine body goes here...
#状态(0: 待审核 ;10:审核未通过 ;20:未开始;30:报名中;35; 报名结束; 40:会议进行中;50:已结束)
update cms_activity set status = 30 where registration_startTime <= NOW() AND registration_endTime >= NOW() and status != 0 and status != 10;
update cms_activity set status = 35 where registration_endTime <= NOW() AND start_time >= NOW() and status != 0 and status != 10;
update cms_activity set status = 40 where start_time <= NOW() AND end_time >= NOW() and status != 0 and status != 10;
update cms_activity set status = 50 where end_time <= NOW() and registration_startTime <= NOW() and status != 0 and status != 10;
END
3. 定时任务
CREATE DEFINER=`root`@`localhost` EVENT `run_update_status` ON SCHEDULE EVERY 60 SECOND STARTS '2019-05-15 00:01:00' ON COMPLETION PRESERVE ENABLE DO BEGIN
CALL UPDATE_STATUS();
END;
参考:https://www.jianshu.com/p/25eea3863d14
https://blog.csdn.net/jijianshuai/article/details/78409381
https://www.cnblogs.com/nxld/p/6624966.html