趙旭輝
(遼寧鐵道職業(yè)技術(shù)學(xué)院 遼寧 121000)
?
使用Mysql模擬列車運(yùn)行完成車底數(shù)據(jù)統(tǒng)計(jì)任務(wù)初探
趙旭輝
(遼寧鐵道職業(yè)技術(shù)學(xué)院 遼寧 121000)
摘要:應(yīng)用MySQL的計(jì)劃任務(wù)結(jié)合存儲(chǔ)過程模擬列車車底的運(yùn)行情況,能夠及時(shí)掌握車底運(yùn)用數(shù)據(jù)的動(dòng)態(tài)變化,既保證數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確率,也使車底數(shù)據(jù)的統(tǒng)計(jì)、查詢工作效率大幅提高,提升用戶的使用體驗(yàn)。
關(guān)鍵詞:MySQL 計(jì)劃任務(wù) 存儲(chǔ)過程 模擬 列車車底
在鐵路運(yùn)營管理過程中,需要對車底的具體運(yùn)用情況進(jìn)行統(tǒng)計(jì),但是由于旅客列車車底運(yùn)用管理的動(dòng)態(tài)變化,致使該項(xiàng)統(tǒng)計(jì)工作存在邏輯復(fù)雜繁瑣、運(yùn)算量大、手動(dòng)統(tǒng)計(jì)易出錯(cuò)、計(jì)算機(jī)統(tǒng)計(jì)耗時(shí)較長等問題。本項(xiàng)目探索使用MySQL計(jì)劃結(jié)合存儲(chǔ)過程來模擬日常列車運(yùn)行情況,并采用階段統(tǒng)計(jì)方法,較好地完成了大數(shù)量車底動(dòng)態(tài)運(yùn)用的快速統(tǒng)計(jì)要求,較大幅度提高了統(tǒng)計(jì)效率,提升了用戶的使用體驗(yàn)。
列車車底周轉(zhuǎn)運(yùn)用是旅客列車日常運(yùn)行管理的一項(xiàng)重要工作 ,涉及到車體運(yùn)用的科學(xué)安排和使用效率。但是要對實(shí)時(shí)運(yùn)行中的車底運(yùn)用數(shù)據(jù)進(jìn)行統(tǒng)計(jì),卻是一項(xiàng)十分復(fù)雜的工作。這是因?yàn)檐嚨走\(yùn)用數(shù)據(jù)來自于多個(gè)層面信息的綜合,尤其是客調(diào)命令會(huì)臨時(shí)改變某列車的車底運(yùn)用規(guī)律,使得列車車底數(shù)據(jù)經(jīng)常發(fā)生變化,加之列車編組眾多,統(tǒng)計(jì)數(shù)據(jù)量很大,使得這項(xiàng)工作,既繁鎖易錯(cuò),又費(fèi)時(shí)費(fèi)力。
以下涉及到列車車底日常統(tǒng)計(jì)相關(guān)的數(shù)據(jù)來源。
(1)列車編組圖定信息與車底周轉(zhuǎn)圖:該圖主要反映列車編組的基本屬性(編組車次、乘務(wù)擔(dān)當(dāng)、車輛擔(dān)當(dāng)以及列車圖定信息)及客運(yùn)車底周轉(zhuǎn)運(yùn)用安排情況。如圖1所示。
(2)列車車次與運(yùn)行時(shí)刻信息:各列車車次的到發(fā)時(shí)刻信息。
(3)客運(yùn)調(diào)度命令信息:主要是動(dòng)態(tài)地對各列車編組或單獨(dú)車次的車底運(yùn)用進(jìn)行的改變或調(diào)整。如圖2所示為客調(diào)的列車調(diào)度命令列表。
針對上述資料,進(jìn)行分析可知,每一張車底周轉(zhuǎn)圖通常由多個(gè)列車編組的車底周轉(zhuǎn)使用信息組成,同一周轉(zhuǎn)圖上的各編組的圖定基本信息(數(shù)量、車型)基本相同;但每個(gè)編組(車次)又有自己的獨(dú)立的使用信息(定員、附注等可能有小幅變化)。調(diào)度命令信息的操作對象既可能是同一張周轉(zhuǎn)圖中的整個(gè)車體交路,也可能是其中某一編組,還可能只是某一個(gè)車次,調(diào)度命令會(huì)動(dòng)態(tài)地改變數(shù)量、車底類型、定員、附注等,因此在進(jìn)行數(shù)據(jù)統(tǒng)計(jì)時(shí)必須考慮相應(yīng)調(diào)度命令的內(nèi)容和作用時(shí)限等。
圖1 列車編組與車底周轉(zhuǎn)圖
圖2 客運(yùn)調(diào)度命令
圖3 主要數(shù)據(jù)表及其關(guān)系
根據(jù)上面分析,建立表groupGraph存儲(chǔ)車底周轉(zhuǎn)圖信息,建立表groupBase對應(yīng)列車編組表信息,建立表groupInfo存儲(chǔ)周轉(zhuǎn)圖中的統(tǒng)一的圖定信息,建立表groupRunInfo存儲(chǔ)周轉(zhuǎn)圖中各車次的實(shí)際運(yùn)行信息,建立表trainRun存儲(chǔ)列車時(shí)刻與運(yùn)行信息,建立表cmdInfo存儲(chǔ)調(diào)度命令信息。各表間的關(guān)系如圖3所示。
上述車底運(yùn)用信息的統(tǒng)計(jì)涉及到復(fù)雜的數(shù)據(jù)庫操作,如果應(yīng)用其他語言進(jìn)行程序設(shè)計(jì),邏輯調(diào)用會(huì)十分復(fù)雜。另外由于調(diào)度命令的存在使得車底運(yùn)用信息具有動(dòng)態(tài)變化和不確定性,必須要獲取各個(gè)車次每天的實(shí)際運(yùn)行信息,才能進(jìn)行準(zhǔn)確統(tǒng)計(jì)。考慮使用MySQL提供的存儲(chǔ)過程在服務(wù)器端進(jìn)行復(fù)雜數(shù)據(jù)庫處理,能加快數(shù)據(jù)處理速度,提高數(shù)據(jù)庫使用效率。而且MySQL自5.1版本支持計(jì)劃任務(wù)事件,利用計(jì)劃任務(wù)事件可以定時(shí)自動(dòng)執(zhí)行的特點(diǎn),結(jié)合存儲(chǔ)過程模擬列車的實(shí)際運(yùn)行情況,從而獲得相關(guān)編組、車次的實(shí)際運(yùn)行信息。
MySQL中開啟計(jì)劃任務(wù)的方法有兩種:
一是執(zhí)行命令SET EVENT_SCHEDULER=ON 臨時(shí)開啟計(jì)劃任務(wù),重新啟動(dòng)MySQL時(shí)需要重新設(shè)定。
二是修改my.ini文件。在MySQL程序的目錄下找到my.ini文件,添加:EVEN_SCHEDULER =1。保存后重啟MySQL服務(wù)即可實(shí)現(xiàn)永久開啟計(jì)劃任務(wù)。
在MySQL中使用SHOW VARIABLES LIKE 'EVENT_SCHEDULER'可以查看是否開啟了計(jì)劃任務(wù)功能。
開啟計(jì)劃任務(wù)后,還要根據(jù)項(xiàng)目需要,考慮建立如下存儲(chǔ)過程:
(1)調(diào)度命令檢查過程
在進(jìn)行調(diào)度命令執(zhí)行前,需要檢查調(diào)度命令的時(shí)效性。即對調(diào)度命令記錄進(jìn)行鑒別,以確定該命令是否失效,并對失效的調(diào)度命令,設(shè)定失效標(biāo)志。設(shè)定了失效標(biāo)志的調(diào)度命令,將不再執(zhí)行。由于調(diào)度命令內(nèi)容靈活,這里對涉及到調(diào)度命令的類型,進(jìn)行了全面分析并歸納總結(jié),本項(xiàng)目將調(diào)度命令按執(zhí)行時(shí)間分為兩大類命令:
確定了調(diào)度命令的分類后,對于調(diào)度命令的檢查也變得十分簡單。對于一次性命令通過標(biāo)志變量的設(shè)置,即可實(shí)現(xiàn)只執(zhí)行一次的效果。而周期性命令,利用當(dāng)前日期與周期n的取余運(yùn)算,即可得出當(dāng)日是否為該命令的執(zhí)行日期。
該項(xiàng)計(jì)劃任務(wù)在每天0:30分自動(dòng)執(zhí)行。
(2)調(diào)度命令執(zhí)行過程
調(diào)度命令最初由具有管理權(quán)限的用戶錄入,進(jìn)入命令表中的各條命令均在執(zhí)行當(dāng)日的凌晨自動(dòng)執(zhí)行。這個(gè)功能的實(shí)現(xiàn)方法就是將該存儲(chǔ)過程設(shè)定為每日凌晨1點(diǎn)自動(dòng)運(yùn)行的計(jì)劃任務(wù)。該任務(wù)通過遍歷調(diào)度命令表(cmdInfo),查詢在當(dāng)天生效的調(diào)度命令,并依據(jù)命令內(nèi)容對作用車次的實(shí)際圖定信息表(groupRunInfo)進(jìn)行加掛、甩掛、換掛等操作,同時(shí)在groupRunInfo表中對應(yīng)的記錄上標(biāo)明適用的命令號,以備日統(tǒng)計(jì)使用。其執(zhí)行流程如圖4所示。
圖4 調(diào)度命令執(zhí)行流程
建立每日凌晨1點(diǎn)自動(dòng)執(zhí)行的計(jì)劃任務(wù),該任務(wù)調(diào)用ExecCMD存儲(chǔ)過程,執(zhí)行當(dāng)日生效的調(diào)度命令,代碼如下:
CREATE EVENT exeEveryDay01
ON SCHEDULE EVERY 1 DAY
STARTS '2015-11-01 01:00:00'
ON COMPLETION PRESERVE ENABLE
DO CALL ExecCMD( );
存儲(chǔ)過程ExecCMD比較簡單,這里不再給出代碼。
(3)模擬列車運(yùn)行過程進(jìn)行日信息統(tǒng)計(jì)過程
該過程通過讀取列車編組表(groupBase),確定當(dāng)日運(yùn)行的車次,依據(jù)列車實(shí)際圖定信息表(groupruninfo),對當(dāng)日的實(shí)際運(yùn)行信息,進(jìn)行日統(tǒng)計(jì),并將統(tǒng)計(jì)信息追加存放于表dayStatistic中,即表dayStatistic中實(shí)際存放了每一天各車次實(shí)際運(yùn)行的匯總信息。其執(zhí)行流程如圖5所示。
每日凌晨1點(diǎn)時(shí),系統(tǒng)自動(dòng)執(zhí)行計(jì)劃任務(wù)cmdPerformace,對存儲(chǔ)在命令列表中的各個(gè)調(diào)度命令進(jìn)行判斷當(dāng)時(shí)運(yùn)行的車次是否發(fā)生改變,對于發(fā)生改變的車次,記錄其改變信息,將變化后的信息按日期存入groupRunInfo表中,未有變動(dòng)的車次信息直接存入groupRunInfo表中。在調(diào)度命令執(zhí)行后,即可自動(dòng)運(yùn)行當(dāng)日數(shù)據(jù)統(tǒng)計(jì)任務(wù),對于當(dāng)時(shí)的車次信息進(jìn)行統(tǒng)計(jì)。
圖5 模擬列車運(yùn)行并進(jìn)行每日統(tǒng)計(jì)流程
(4)月統(tǒng)計(jì)任務(wù)和年統(tǒng)計(jì)任務(wù)
月統(tǒng)計(jì)任務(wù)于每月1日凌晨2:00,對上一月的車次運(yùn)行信息的日統(tǒng)計(jì)表(dayStatistic)數(shù)據(jù)進(jìn)行月匯總,并存放于月統(tǒng)計(jì)表中(monthStatistc)。月統(tǒng)計(jì)存儲(chǔ)過程名為monthStatistic。
CREATE EVENT exeMonth02
ON SCHEDULE EVERY 1 MONTH
STARTS '2015-01-01 02:00:00'
ON COMPLETION PRESERVE ENABLE
DO CALL monthStatistic( );
年統(tǒng)計(jì)過程定于每年的1月1日的凌晨3:00運(yùn)行,其工作對象是存儲(chǔ)于月統(tǒng)計(jì)表中的上一年度的數(shù)據(jù),將其進(jìn)行年度匯總,并存放于年統(tǒng)計(jì)表中(yearStatistic)。年統(tǒng)計(jì)存儲(chǔ)過程名為yearStatistic。
CREATE EVENT exeYear03
ON SCHEDULE EVERY 1 YEAR
STARTS '2015-01-01 03:00:00'
ON COMPLETION PRESERVE ENABLE
DO CALL yearStatistic( );
(5)動(dòng)態(tài)統(tǒng)計(jì)與查詢
這一功能的實(shí)現(xiàn)仍然通過調(diào)用存儲(chǔ)過程實(shí)現(xiàn)。該過程接收兩個(gè)參數(shù)用于確定查詢的起止時(shí)間信息。系統(tǒng)用戶提供的起止信息依據(jù)時(shí)間跨度進(jìn)行時(shí)間分段,分別從年匯總表、月匯總表和日匯總表中抽取符合時(shí)間要求的信息,放入臨時(shí)表中,進(jìn)行再次進(jìn)行匯總統(tǒng)計(jì)。并將生成的符合要求的統(tǒng)計(jì)信息存放于事先定義好的固定表queryStatistic中返回給用戶使用。由于事先進(jìn)行了年月日的基礎(chǔ)信息統(tǒng)計(jì),所以這一過程的動(dòng)態(tài)查詢非常迅速,實(shí)現(xiàn)了較高的查詢效率。另外,用戶還可對查詢到的數(shù)據(jù)還可以進(jìn)一步地進(jìn)行篩選,實(shí)現(xiàn)高級查詢。此過程十分簡單,不再詳述。
使用Mysql的定時(shí)計(jì)劃結(jié)合存儲(chǔ)過程對于完成像列車運(yùn)行數(shù)據(jù)統(tǒng)計(jì)等一類具有運(yùn)行規(guī)律,但運(yùn)行信息又時(shí)常變動(dòng)的對象非常有效。該方案應(yīng)用存儲(chǔ)過程進(jìn)行固定的信息處理同時(shí)結(jié)合了計(jì)劃任務(wù)定時(shí)自動(dòng)的特點(diǎn),實(shí)現(xiàn)對真實(shí)運(yùn)行情況的現(xiàn)實(shí)模擬操作,掌握了對信息的動(dòng)態(tài)變化。在統(tǒng)計(jì)分析階段,也利用計(jì)劃任務(wù)的自動(dòng)執(zhí)行特點(diǎn),階段性、化整為零地分解了較大時(shí)間范圍內(nèi)復(fù)雜的數(shù)據(jù)統(tǒng)計(jì)任務(wù),降低了最終用戶查詢時(shí)的統(tǒng)計(jì)工作量,加速了最終結(jié)果的呈現(xiàn)速度,提高了統(tǒng)計(jì)效率,提升了用戶體驗(yàn)。另外存儲(chǔ)過程工作于服務(wù)器端,充分發(fā)揮了服務(wù)的強(qiáng)大運(yùn)算效能,減少了客戶端的運(yùn)算,實(shí)現(xiàn)了瞬時(shí)統(tǒng)計(jì)出結(jié)果,極大地提升用戶的使用體驗(yàn)。此方法對于類似對象的日常運(yùn)行情況也能實(shí)現(xiàn)按規(guī)則自動(dòng)化管理,值得借鑒和運(yùn)用。
參考文獻(xiàn):
[1]呂苗苗,倪少權(quán),陳釘均,張?bào)K.新舊交替列車運(yùn)行圖客車車底周轉(zhuǎn)圖智能編制方法研究[J].鐵道學(xué)報(bào).2012.10
[2]孔祥盛. MySQL核心技術(shù)與最佳實(shí)踐[M].北京:人民郵電出版社.2014
Statistics Collection of the Train Carriages Using the Mysql Simulation System of Train Operation
Zhao Xu-hui
(Liaoning Railway Vocational and Technical college Liaoning 121000 China)
Abstract:MySQL event scheduler and stored procedure can simulate the running of the train carriage. It is beneficial to grasp the dynamic, ensure the accuracy of the statistical data and improve the carriage data statistics, the work efficiency and the user experience.
Key words:MySQL event scheduler stored procedure simulation the train carriage
文獻(xiàn)標(biāo)識碼:中國分類號:U29A
文章編號:1673-1816(2016)01-0071-05
收稿日期:2015-11-14
作者簡介:趙旭輝(1974-),男,漢,遼寧朝陽人,碩士,副教授。