劉繼敏
摘要:在原有的數(shù)據(jù)驗(yàn)證平臺中采用軟件進(jìn)行數(shù)據(jù)交換,存在較大的因中間環(huán)節(jié)處理失敗或是單點(diǎn)故障的可能性,同時監(jiān)控困難。在新的數(shù)據(jù)驗(yàn)證平臺中直接采用在oracle中使用PL/SQL語言進(jìn)行事務(wù)處理,極大提高了系統(tǒng)的穩(wěn)定性和高執(zhí)行性能。
關(guān)鍵詞:PL/SQL;數(shù)據(jù)驗(yàn)證平臺;事務(wù)控制;自治性事務(wù);并發(fā)訪問與會話
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2017)10-0101-01
1 為什么選擇PLSQL腳本語言
數(shù)據(jù)驗(yàn)證平臺是數(shù)據(jù)交換類型的中間平臺,它作為一種數(shù)據(jù)交換服務(wù)在后臺運(yùn)行,首要解決的問題就是平臺的穩(wěn)定性。
數(shù)據(jù)驗(yàn)證平臺原有的設(shè)計(jì)方案是基于IBM InfoSphere DataStage軟件作為數(shù)據(jù)抽取和同步的中間層,它將各個業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫中的證書和產(chǎn)品數(shù)據(jù)同步到數(shù)據(jù)驗(yàn)證平臺的數(shù)據(jù)庫。再通過Java編寫的Web應(yīng)用進(jìn)行Job定時調(diào)度,調(diào)用總局e-CIQ的Web Service接口來發(fā)送通關(guān)驗(yàn)證平臺的證書和產(chǎn)品數(shù)據(jù)。該設(shè)計(jì)方案引入Java Web應(yīng)用和IBM InfoSphere DataStage等中間處理環(huán)節(jié),這些環(huán)節(jié)并不是必須的,而且會帶來更多的因中間環(huán)節(jié)處理失敗或是單點(diǎn)故障的可能性。同時,IBM InfoSphere DataStage是第三方軟件,目前還只能從日志文件中得到每次任務(wù)處理結(jié)果信息,監(jiān)控不方便。
新的數(shù)據(jù)驗(yàn)證平臺設(shè)計(jì)方案是完全使用ORACLE數(shù)據(jù)庫端的腳本語言PL/SQL來實(shí)現(xiàn),不再使用舊方案的Java Web應(yīng)用和IBM InfoSphere DataStage。新方案的所有代碼完全在數(shù)據(jù)驗(yàn)證平臺自身的數(shù)據(jù)庫中調(diào)度和運(yùn)行,具備高度穩(wěn)定性和高執(zhí)行性能。
PL/SQL一種塊結(jié)構(gòu)的語言,主要用于ORACLE數(shù)據(jù)庫中。PL/SQL程序塊是最基本單位,整個PL/SQL程序塊分三部分:用DECLARE關(guān)鍵字的聲明部分、用BEGIN/END關(guān)鍵字包括的執(zhí)行部分和用EXCEPTION關(guān)鍵字的異常處理部分。程序塊是可以嵌套的,完全可以控制變量的可見范圍和異常范圍。PL/SQL語言可以完成相關(guān)的數(shù)據(jù)抽取、數(shù)據(jù)準(zhǔn)備、數(shù)據(jù)打包和數(shù)據(jù)發(fā)送等功能。
2 面臨的技術(shù)問題
理論上,雖然PL/SQL可以實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證平臺數(shù)據(jù)交換所有功能,但作為生產(chǎn)力語言,還是需要對它的語法規(guī)范、數(shù)據(jù)類型、程序包封裝、事務(wù)控制和自治性的事務(wù)控制(ORACLE特性功能)、并發(fā)訪問與數(shù)據(jù)庫會話關(guān)系、異常處理、JOB功能調(diào)度和性能優(yōu)化等方面進(jìn)一步深入研究,完善解決以上各類問題。
3 具體實(shí)現(xiàn)方法
3.1 JOB調(diào)度
數(shù)據(jù)驗(yàn)證平臺主體的功能是通過JOB調(diào)度來驅(qū)動的,使用ORACLE程序包DBMS_SCHEDULER.CREATE_JOB方法創(chuàng)建執(zhí)行JOB。以下腳本是JOB任務(wù)的創(chuàng)建、恢復(fù)、暫停和刪除腳本。在創(chuàng)建腳本中,JOB_ACTION參數(shù)值是JOB要執(zhí)行的程序代碼,該代碼調(diào)用程序包INTF_MAIN的PC_MAIN方法,即INTF_MAIN.PC_MAIN()。REPEAT_INTERVAL參數(shù)值是JOB執(zhí)行的時間間隔,DAILY是每天運(yùn)行,BYHOUR、BYMINUTE和BYSECOND是定義具體執(zhí)行的整點(diǎn)時刻。
3.2 程序包功能
數(shù)據(jù)驗(yàn)證平臺將所有的可執(zhí)行代碼封裝到ORACLE的PACKAGE對象中,就像剛才在創(chuàng)建JOB時調(diào)用ORACLE系統(tǒng)級的程序包DBMS_SCHEDULER一樣。程序包對象分為兩部分來定義,一是接口部分,二是實(shí)現(xiàn)部分。
程序包INTF_MAIN包括數(shù)據(jù)驗(yàn)證平臺所有的業(yè)務(wù)功能。程序包實(shí)現(xiàn)的部分方法,包括全局變量定義和PC_MAIN方法的定義(JOB創(chuàng)建時調(diào)用的主程序方法)。
我們在實(shí)施中可以看到還調(diào)用了INTF_LOGS包和INTF_ EMAIN包,這兩個包是我們開發(fā)用于日志記錄包和郵件發(fā)送包。
還可以看到,對于每個業(yè)務(wù)系統(tǒng),都會調(diào)用PC_CERTTYPE方法,傳入指定業(yè)務(wù)系統(tǒng)的系統(tǒng)ID,例如證書等系統(tǒng)。
3.3 并發(fā)訪問與會話
對于ORACLE每一次后臺JOB調(diào)度,都會啟動一個新的SESSION,即每次都是不同的SID與SERIAL#組合(SID可能會相同,但SERIAL#肯定不同)。同時,程序包INTF_MAIN包體中定義的全局變量只在JOB當(dāng)前執(zhí)行的會話中可以共享訪問,在不同的會話中是不能共享數(shù)據(jù)的,因此JOB執(zhí)行任務(wù)可以并行執(zhí)行。
3.4 事務(wù)控制
在PC_CERTTYPE方法內(nèi)部,實(shí)現(xiàn)了數(shù)據(jù)邏輯處理的四個階段,數(shù)據(jù)接收、數(shù)據(jù)準(zhǔn)備、數(shù)據(jù)打包和數(shù)據(jù)發(fā)送。對于每一個數(shù)據(jù)處理階段,是一個完整的事務(wù)提交和回滾。如果事務(wù)提交,會提交數(shù)據(jù)和記錄日志。如果發(fā)生回滾,則會記錄日志和發(fā)送郵件。
3.5 自治性事務(wù)
自治事務(wù)是指一個塊結(jié)構(gòu)內(nèi)部的事務(wù)控制脫離外部調(diào)用的事務(wù)上下文,這個塊結(jié)構(gòu)本身的事務(wù)稱之為自治事務(wù),外部調(diào)用的事務(wù)稱之為主事務(wù)。自治事務(wù)通過編譯器參數(shù)PRAGMA AUTONOMOUS_ TRANSACTION來指定。自治事務(wù)由主事務(wù)啟動后,主事務(wù)進(jìn)入掛起狀態(tài),當(dāng)自治事務(wù)執(zhí)行提交事務(wù)或回滾事務(wù)后,主事務(wù)恢復(fù)執(zhí)行,主事務(wù)做自己的提交或回滾。也就是說,即使主事務(wù)回滾,自治事務(wù)也可以提交成功的。通關(guān)驗(yàn)證平臺對于JOB執(zhí)行的日志數(shù)據(jù)記錄采用自治事務(wù)。對于每一個數(shù)據(jù)處理階段(參考PC_CERTTYPE代碼),采用一個主事務(wù)提交或回滾。但是,無論主事務(wù)是否成功,自治事務(wù)作為獨(dú)立與主事務(wù)的事務(wù),是可以提交并記錄日志的。
3.6 PL/SQL語言結(jié)構(gòu)
從PC_CERTTYPE方法中,可以看到該方法整體是一個BEGIN … END代碼結(jié)構(gòu)。對于每一個數(shù)據(jù)邏輯處理階段,又會嵌套一個BEGIN EXCEPTION END;代碼結(jié)構(gòu)。EXCEPTION中可以編寫異常處理代碼,與JAVA異常機(jī)制類似,可以定義異常、捕獲異常、拋出異常和嵌套異常。
4 結(jié)語
采用ORACLE數(shù)據(jù)庫端的腳本語言PL/SQL來實(shí)現(xiàn)新的數(shù)據(jù)驗(yàn)證平臺。通過實(shí)踐驗(yàn)證,具有極高的穩(wěn)定性和優(yōu)秀的性能表現(xiàn)。在具體實(shí)現(xiàn)中,針對事務(wù)處理,在JOB調(diào)度、程序包功能、并發(fā)訪問與會話、事務(wù)控制、自治性事務(wù)處理等方面具有很強(qiáng)的處理能力。
參考文獻(xiàn)
[1]Oracle PL/SQL程序設(shè)計(jì)(第6版),ISBN: 9787115448750,史蒂芬·弗伊爾斯坦(Steven Feuerstein)(作者),比爾·普里比爾(Bill Pribyl)(作者),方鑫 (譯者),人民郵電出版社,2017年7月.endprint