最常用的做法是使用UNIX的cron直接執(zhí)行Java程序。
創(chuàng)新互聯(lián)建站成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點,以客戶需求中心、市場為導(dǎo)向”的快速反應(yīng)體系。對公司的主營項目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計、行業(yè) / 企業(yè)門戶設(shè)計推廣、行業(yè)門戶平臺運營、成都app軟件開發(fā)公司、手機網(wǎng)站制作設(shè)計、微信網(wǎng)站制作、軟件開發(fā)、成都西信服務(wù)器托管等實行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從創(chuàng)新互聯(lián)建站可以獲得的服務(wù)效果。
并不需要在Java做的那么復(fù)雜。
Windows服務(wù)器也有類似于cron的任務(wù)管理功能,同理
---------------------------
Tomcat不是用來管理定時任務(wù)的,如果沒有HTTP請求,Servlet是不會被執(zhí)行的。
建議lz把定期執(zhí)行的處理做成一個獨立的Java程序,用cron執(zhí)行。
如果不想寫?yīng)毩⒌腏ava程序,也可以用cron定期向Tomcat發(fā)送Http請求,但是,這樣做的話注意程序處理時間不能太長,因為HTTP通信有timeout的制約。
事件調(diào)度器是定時觸發(fā)執(zhí)行的,在這個角度上也可以稱作是臨時的觸發(fā)器。觸發(fā)器只是針對某個表產(chǎn)生的事件執(zhí)行一些語句,而事件調(diào)度器則是在某一個(間隔)時間執(zhí)行一些語句。事件是由一個特定的線程來管理的,也就是所謂的事件調(diào)度器。
代碼:/*開啟event_scheduler,也可以設(shè)置為on*/
set global event_scheduler =1;
/*創(chuàng)建簡單的任務(wù),每分鐘執(zhí)行一次,從一個表取數(shù)據(jù)插入到另一個表,也可以定時取,可以參看下面文檔,此處為簡單例子*/
CREATE EVENT MyEvent
ON SCHEDULE EVERY 1 MINUTEDOINSERT INTO list_test (字段1,字段1,字段1,字段1,字段1) select 字段1,字段1,字段1,字段1,字段1 from 表2 where id = 510;
/*每天固定時間執(zhí)行*/
CREATE EVENT EVENT_ADD_FOR20_ENOUGH
ON SCHEDULE EVERY 1 DAY
DROP PROCEDURE IF EXISTS `mystock`.`TEST_KKK`$$
CREATE PROCEDURE `mystock`.`TEST_KKK`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/BEGINDECLARE NUM INTEGER DEFAULT 0;
DECLARE $A INT;
SELECT (20-COUNT(STOCK_CODE)) as number into NUM FROM get_stock_list WHERE FLAG = 0 AND STIME = curdate();
IF NUM0 THEN
PREPARE STMP FROM 'INSERT INTO get_stock_list (stock_code,stock_name,close,raises,stime) select stock_code,stock_name,close,result1,selectd from choice_stock where stock_code not in (select stock_code from get_stock_list where stime = curdate() and flag = 0) and selectd = curdate() and selectd = curdate() order by id limit ?' ;
查看event是否開啟: show variables like '%sche%';
將事件計劃開啟: set global event_scheduler=1;
關(guān)閉事件任務(wù): alter event e_test ON COMPLETION PRESERVE DISABLE;
開戶事件任務(wù): alter event e_test ON COMPLETION PRESERVE ENABLE;
簡單實例.
創(chuàng)建表 CREATE TABLE test(endtime DATETIME);
創(chuàng)建存儲過程test
CREATE PROCEDURE test ()
BEGIN
update examinfo SET endtime = now() WHERE id = 14;
END;
創(chuàng)建event e_test
CREATE EVENT if not exists e_test
on schedule every 30 second
on completion preserve
do call test();
每隔30秒將執(zhí)行存儲過程test,將當(dāng)前時間更新到examinfo表中id=14的記錄的endtime字段中去
1) 首先來看一個簡單的例子來演示每秒插入一條記錄到數(shù)據(jù)表
USE test;
CREATE TABLE aaa (timeline TIMESTAMP);
CREATE EVENT e_test_insert
ON SCHEDULE EVERY 1 SECOND
DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);
等待3秒鐘后,再執(zhí)行查詢看看:
copyright dedecms
mysql SELECT * FROM aaa;
+---------------------+
| timeline |
+---------------------+
| 2007-07-18 20:44:26 |
| 2007-07-18 20:44:27 |
| 2007-07-18 20:44:28 |
+---------------------+
2) 5天后清空test表:
CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
3) 2007年7月20日12點整清空test表:
CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
DO TRUNCATE TABLE test.aaa;
4) 每天定時清空test表:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
DO TRUNCATE TABLE test.aaa;
5) 5天后開啟每天定時清空test表:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
6) 每天定時清空test表,5天后停止執(zhí)行:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
7) 5天后開啟每天定時清空test表,一個月后停止執(zhí)行
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE test.aaa;
[ON COMPLETION [NOT] PRESERVE]可以設(shè)置這個事件是執(zhí)行一次還是持久執(zhí)行,默認(rèn)為NOT PRESERVE。
8) 每天定時清空test表(只執(zhí)行一次,任務(wù)完成后就終止該事件):
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE
DO TRUNCATE TABLE test.aaa;
[ENABLE | DISABLE]可是設(shè)置該事件創(chuàng)建后狀態(tài)是否開啟或關(guān)閉,默認(rèn)為ENABLE。
[COMMENT ‘comment’]可以給該事件加上注釋。
三、修改事件(ALTER EVENT)
ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]
1) 臨時關(guān)閉事件
ALTER EVENT e_test DISABLE;
2) 開啟事件
ALTER EVENT e_test ENABLE;
3) 將每天清空test表改為5天清空一次:
ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;
四、刪除事件(DROP EVENT)
語 法很簡單,如下所示:
DROP EVENT [IF EXISTS] event_name
例如刪除前面創(chuàng)建的e_test事件
DROP EVENT e_test;
當(dāng)然前提是這個事件存在,否則會產(chǎn)生ERROR 1513 (HY000): Unknown event錯誤,因此最好加上IF EXISTS
DROP EVENT IF EXISTS e_test;
create event test
ON SCHEDULE AT '2007-09-01 12:00:00' + INTERVAL 1 DAY
on completion not preserve
do insert into yyy values('hhh','uuu');
解釋:從2007-09-01開始,每天對表yyy在12:00:00進行一個插入操作。而且只執(zhí)行一次(on completion not preserve )
我的計劃任務(wù)為:
create event sysplan
ON SCHEDULE AT '2010-05-22 23:00:00' + INTERVAL 1 DAY
on completion not preserve
do truncate table bjproj.ae_tmp;
三、通過設(shè)定全局變量event_scheduler 的值即可動態(tài)的控制事件調(diào)度器是否啟用。
查看是否event_scheduler開啟mysql SHOW VARIABLES LIKE '%event%';
設(shè)置開啟mysql SET GLOBAL event_scheduler=ON;
四、例子:
每分鐘插入一條日志:DELIMITER //CREATE EVENT `user_log_event` ON SCHEDULE EVERY 1 MINUTE STARTS '2010-12-27 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN INSERT INTO log SET addtime=NOW();END//
調(diào)用存儲過程:DELIMITER //CREATE EVENT `user_log_event` ON SCHEDULE EVERY 1 DAY STARTS '2010-00-00 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN CALL user_log_prov();END//
在MySQL 5.5 Command Line Client下調(diào)試通過。
mysql實現(xiàn)定時任務(wù)是有一個時間調(diào)度器,所以首先要查看這個時間調(diào)度器是否開啟。
查看的命令:
show variables like 'event_scheduler'
如果沒有打開,則設(shè)置打開。設(shè)置的命令是:
set global event_scheduler = ON; 或set global event_scheduler = 1;
確定打開事件調(diào)度器后,我們可以創(chuàng)建一個定時任務(wù)。
創(chuàng)建定時任務(wù)的語法為:
create event 定時任務(wù)名稱
ON schedule 定時時間
do
定時任務(wù)所要執(zhí)行的sql;
example:每隔一分鐘往表tt里插入一條數(shù)據(jù)
create event insert_tt
ON schedule every 1 MINUTE
do
insert into tt values(1);
如果要執(zhí)行多條sql則可用多個do
create event insert_tt
ON schedule every 1 MINUTE
do
insert into tt values(1);
do
.......
使用命令查看所有的定時任務(wù)及其狀態(tài):
show processlist
如果要停掉某個定時任務(wù)可以使用:
alter event 定時任務(wù)名 ON
COMPLETION PRESERVE DISABLE;
example:
alter event insert_tt ON
COMPLETION PRESERVE DISABLE;
開啟某個定時任務(wù):
alter event 定時任務(wù)名稱 ON
COMPLETION PRESERVE ENABLE;
當(dāng)前文章:mysql怎么定時執(zhí)行 mysql定時器 每天執(zhí)行
URL鏈接:http://muchs.cn/article34/docoppe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、移動網(wǎng)站建設(shè)、App設(shè)計、定制網(wǎng)站、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)