您好,登錄后才能下訂單哦!
背景:
最近遇到一個(gè)case,Client端程式調(diào)用存儲(chǔ)過(guò)程SP1,過(guò)程SP1執(zhí)行完成后返回結(jié)果到Client。
因?yàn)檫^(guò)程SP1執(zhí)行時(shí)間要5秒鐘,時(shí)間太長(zhǎng)Client用戶無(wú)法接受。
分析主過(guò)程SP1性能,發(fā)現(xiàn)主要是其中調(diào)用的子過(guò)程SP2執(zhí)行需要4秒,且子過(guò)程SP2中一條SQL因?yàn)橘Y料量巨大邏輯復(fù)雜已無(wú)優(yōu)化可能。另外子過(guò)程SP2的主要是計(jì)算審計(jì)功能并記錄日志作用的。
設(shè)想:
能否讓用戶執(zhí)行主過(guò)程時(shí)不等子過(guò)程完成就 直接返回結(jié)果 ,子過(guò)程異步方式在后臺(tái)慢慢的運(yùn)行?
直接通過(guò)Oracle的技術(shù)能否實(shí)現(xiàn)?
答案是可以的,通過(guò)DBMS_JOB.SUBMIT 下面的方法可以實(shí)現(xiàn)。
實(shí)現(xiàn):
創(chuàng)建log表:
CREATE TABLE SFIS1.JOBSUBMIT_LOG ( EXE_TIME DATE, DATAX VARCHAR2(5 BYTE) )
創(chuàng)建子過(guò)程:
CREATE OR REPLACE PROCEDURE SFIS1.JOB_SUBMIT (DATA3 IN VARCHAR2) IS BEGIN IF DATA3='1' THEN dbms_lock.sleep(10); --模擬子過(guò)程執(zhí)行10秒需要 insert into sfis1.jobsubmit_log values(SYSDATE,DATA3); ELSE insert into sfis1.jobsubmit_log values(SYSDATE,DATA3); END IF; commit; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('FAIL2!'); END;
創(chuàng)建主過(guò)程:
CREATE OR REPLACE PROCEDURE SFIS1.JOB_SP (DATA1 IN VARCHAR2,DATA2 IN VARCHAR2) IS START_TIME DATE; l_job NUMBER; BEGIN START_TIME := SYSDATE; DBMS_OUTPUT.PUT_LINE ('Start Time:' || TO_CHAR (START_TIME, 'YYYY-MM-DD-HH24:MI:SS')); DBMS_JOB.submit (l_job, 'SFIS1.JOB_SUBMIT('||data1||');'); DBMS_JOB.submit (l_job, 'SFIS1.JOB_SUBMIT('||data2||');'); COMMIT; DBMS_OUTPUT.PUT_LINE ('Elapsed Time:' || CEIL ( (SYSDATE - START_TIME) * 24 * 60 * 60)); --計(jì)算主過(guò)程運(yùn)行總時(shí)間 EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('FAIL!'); END;
執(zhí)行主過(guò)程:
exec SFIS1.JOB_SP('1','2');
結(jié)果:
Start Time:2019-06-04-10:11:12
Elapsed Time:0 --執(zhí)行時(shí)間0秒,說(shuō)明子過(guò)程已經(jīng)異步在后臺(tái)執(zhí)行了,主過(guò)程并沒(méi)有等待子過(guò)程執(zhí)行完成
查詢log表:
select * from sfis1.jobsubmit_log;
2019/6/4 10:11:13 2
2019/6/4 10:11:23 1 --進(jìn)一步說(shuō)明子過(guò)程異步在后臺(tái)執(zhí)行
以上,主要通過(guò)
DBMS_JOB.SUBMIT
并行異步后臺(tái)執(zhí)行存儲(chǔ)過(guò)程。
本文使用技術(shù)主要參考Tom大師:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。