您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)mysql中awesome-stored-procedure發(fā)布的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
前段時間因為線下分析庫上的存儲過程SP無規(guī)范的泛濫,導(dǎo)致ETL和BI報表經(jīng)常出現(xiàn)各種死鎖阻塞問題。遂決定動手整個簡單的SP編碼規(guī)范,其實主要目的就是記錄SP的運行日志和狀態(tài)。
存儲過程在很多“互聯(lián)網(wǎng)新生代”程序員的觀念里可能已經(jīng)是上古物件了吧?現(xiàn)而今大部分的互聯(lián)網(wǎng)系統(tǒng)實現(xiàn)都不太可能采用存儲過程的實現(xiàn)方式,因為它對數(shù)據(jù)庫造成的負(fù)擔(dān)、難于調(diào)試、移植性差,以及在分布式、高并發(fā)場景下的天然劣勢,都阻礙了它的使用。所以阿里巴巴Java編程規(guī)范里明確規(guī)定“禁止使用存儲過程”也就不足為奇了。
但是很多公司的線下關(guān)系型分析庫上,SP仍舊是相當(dāng)常用的一種技術(shù)手段。SP泛濫后主要容易出現(xiàn)以下幾點病癥:
1. 基于SP創(chuàng)建的Event運行頻率和運行時長設(shè)置的盲目且隨意。這會導(dǎo)致:
SP自身本次還沒運行完,下一個自己就啟動了,結(jié)果自己把自己鎖死;
不同SP之間有依賴順序,一旦前置SP出現(xiàn)超時,后續(xù)的SP執(zhí)行只能是錯誤的或者鎖死的狀態(tài);
2. SP的執(zhí)行過程是黑盒、不可見的。準(zhǔn)確的說就是SP在運行過程中沒有足夠的日志線索,很多時候只知道卡主了,但不知道卡在那里。
3. SP沒有異常處理。SP運行過程中發(fā)生錯誤,若沒有捕獲處理,導(dǎo)致最終運行失敗,那么這個SP在整個依賴鏈路的越前端,恢復(fù)成本將越高昂。
上述三個問題最終都可以靠一張日志表來解決,另外為了實現(xiàn)序號自增,又多建了一張序號表,總共2張表。
SP日志工具的代碼我已經(jīng)上傳到了Github上,方便自己和大家翻閱。又因為本人特別喜歡Github上的Awesome系列,順道碰個瓷,這個代碼庫命名為了
awesome-stored-procedure
https://github.com/NicholasQu/awesome-stored-procedure
目前都是基于MYSQL編寫的,其他數(shù)據(jù)庫的有空再考慮完善一下吧。接下來簡單介紹下這幾個Function /Procedure。
FUNCTION getSeqNo
/**********************************************
* 使用示例
**********************************************/
select getSeqNo('mall'), getSeqNo('pay');
功能:根據(jù)序號類別,獲取全局自增序號。
不同類別的交叉運行會導(dǎo)致序號跳空,該函數(shù)不保同一類別內(nèi)序號的連續(xù)性。
PROCEDURE logSp*
/**********************************************
* 使用示例
**********************************************/
call logSpStart('sp1','testing sp1',100,@sp_exec_no);
call logSpStartAndCheck('sp1','testing sp1',100,'sp2', date_add(now(), interval -1 minute), now(), @sp_exec_no);
call logSpEnd('sp1','end sp1', @sp_exec_no);
SP啟動和先決條件檢查
用于記錄SP啟動時間和狀態(tài),并檢查可以繼續(xù)運行的條件是否滿足:
1. 自身的運行頻度較高,之前自身是否還未運行完成。該情況調(diào)用logSpStart即可;
2. 依賴其他的SP運行完成,自身方能啟動。該情況需調(diào)用logSpStartAndCheck;
SP調(diào)試信息打印
用于打印Info級別的調(diào)試日志, 調(diào)用logSpInfo;
SP結(jié)束日志打印 logSpEnd
用于表示該SP已運行完成。注意這里只標(biāo)識SP的完成,并不一定成功,整個SP中間過程可能發(fā)生了異常,但是繼續(xù)運行完畢了。
SP異常處理
對異常進行處理。有兩種方式:
1. 若該異常無關(guān)痛癢,可以繼續(xù)后續(xù)邏輯的話,使用logSpErrAndContinue;
2. 若該異常直接可以導(dǎo)致SP終止,調(diào)用logSpErrAndEnd;
標(biāo)準(zhǔn)SP寫法
參照 p_sp_demo.MYSQL.SP.sql
https://github.com/NicholasQu/awesome-stored-procedure/blob/master/recordSpLogs/p_sp_demo.MYSQL.SP.sql
關(guān)于“mysql中awesome-stored-procedure發(fā)布的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。