1. 程式人生 > >mysql下儲存過程與定時器

mysql下儲存過程與定時器

一年前,第一次接觸資料庫的時候。發現專案上的一個表很神奇。當用戶提交資料的時候,狀態為0(表示未執行)。過了一陣子狀態為1(表示正在執行),又過一陣子狀態為2(表示執行成功)或者3(表示執行失敗)。
第一次接觸程式設計的小白感覺很神奇。因為神奇,就會以為特別複雜的程式。加上一直沒機會研究,對這一塊也一直沒搞明白。
到了現在,換了公司,換了專案。需要自己去修改儲存過程,才發現。這只不過是一個非常簡單的資料庫定時器。有時候需要自己多動手去實踐,不要還沒開始就打退堂鼓,這樣是一點也學不到東西。
廢話不多說,開始正文內容(每次寫技術文章都要廢話一大堆…這是種病)
以下通過一個儲存過程,和一個呼叫儲存過程的定時器來說明本篇文章。
儲存過程


mysql存在兩種方式(函式和儲存過程),來使資料在資料庫中處理。以節省程式設計師在應用內對資料的處理花費的時間。一般來說,資料庫來處理效能上和程式碼量上來看,要比直接在應用中處理好得多。(個人理解)

建立一個函式或者儲存過程十分簡單。(函式跟儲存過程稍有區別,這裡不做說明。)
一下為建立簡單儲存過程程式碼(程式中涉及到的表,需提前建好)

DELIMITER $$  
CREATE PROCEDURE test ()
    BEGIN
    INSERT INTO a(
    date_string,
    info
    )VALUES (now(),'456');
    END
DELIMITER ;

程式碼中第一行和最後一行是修改mysql的分割符,預設的分割符為;為避免儲存過程中儲存;對程式的影響,先宣告分割符,結束程式後再修改回來。
BEGIN和END表示儲存過程的開始和結束。
文章為了簡單說明儲存過程,使用了一個簡單的儲存過程。一般來說儲存過程還會有輸入、輸出、輸入輸出三種引數。前兩種很容易理解,就像函式的輸入輸出一樣。第三種引數,輸入輸出,就是這個變數作為傳入值,又作為輸出值。
這樣一個簡單的儲存過程就建好了。

定時器(EVENT)
定時器,在mysql中稱為事件排程器(Event)。這樣我使用一個定時器名詞,是為了能一眼知道是什麼東西。
事件排程器,是將資料庫按自定義的時間週期觸發某種操作。但是區別於觸發器。(mysql中還有一種觸發器,使用在insert和update中。)
以下為事件排程器的程式碼。

drop event if exists test_event;
create event test_event
on schedule every 1 day
STARTS now()
do call test();

程式碼也很容易理解。
第一行為,如果存在這個事件,則刪除。
第二行為,建立一個名為test_event的事件。
第三行為,週期是每一天。
第四行為,這個事件,從現在開始執行。
第五行為,這一行是這個事件的內容,執行test()這個儲存過程。(mysql中通話call 來呼叫函式和儲存過程)
事件排程器也建立結束,其實使用起來非常簡單。
但是問題來了,好像以上程式碼執行之後。並沒有想象得那樣,程式自動跑起來。
原因是,mysql並沒有預設開啟事件排程器,還需要我們把mysql中的事件排程器開啟。
開啟事件排程器

show variables like 'event_scheduler';
set global event_scheduler='on';

這兩行程式碼,第一行是檢視事件排程器的狀態。預設為OFF。第二行是開啟事件排程器。
好了,到此完整的儲存過程和定時器就結束了。程式也能安裝設定的時間,自動跑起來。
本來寫到這文章就應該結束了,不過我的測試程式碼已經寫好了。那就再補充點擴充套件內容。
格式化表
定時器寫好之後,程式就好安裝我們設定的時間不停的執行下去。我的測試程式碼一天執行一次,其實還好。但是有些系統需要1分鐘或者2分鐘執行一次。按照這種速度,很快我們的日誌表會儲存大量的資料。所以還需要一個定時清除表的定時器。

drop event if exists truncate_event;
create event truncate_event
on schedule every 1 week
do truncate a;

程式碼也很容易看懂。這裡就不說明。
預設開啟事件排程器
因為mysql是預設關閉事件排程器的,哪怕你通過上面的程式碼開啟了排程器。哪天資料庫或者伺服器被重啟了。我們的mysql又把事件排程器關閉。為了避免不必要的麻煩,我們需要將mysql設定為預設開啟事件排程器狀態。

首先開啟mysql的配置檔案my.ini。
找到[mysqld]所在的位置,在這個位置下面新增一下程式碼。

event_scheduler=ON

儲存重啟之後,mysql就好預設開啟事件排程器了。