背景:
最近遇到一个case,Client端程式调用存储过程SP1,过程SP1执行完成后返回结果到Client。
因为过程SP1执行时间要5秒钟,时间太长Client用户无法接受。
分析主过程SP1性能,发现主要是其中调用的子过程SP2执行需要4秒,且子过程SP2中一条SQL因为资料量巨大逻辑复杂已无优化可能。另外子过程SP2的主要是计算审计功能并记录日志作用的。
设想:
能否让用户执行主过程时不等子过程完成就
直接返回结果
,子过程异步方式在后台慢慢的运行?
直接通过Oracle的技术能否实现?
答案是可以的,通过DBMS_JOB.SUBMIT 下面的方法可以实现。
实现:
创建log表:
CREATE TABLE SFIS1.JOBSUBMIT_LOG
(
EXE_TIME DATE,
DATAX VARCHAR2(5 BYTE)
)
创建子过程:
CREATE OR REPLACE PROCEDURE SFIS1.JOB_SUBMIT (DATA3 IN VARCHAR2)
IS
BEGIN
IF DATA3='1' THEN
dbms_lock.sleep(10); --模拟子过程执行10秒需要
insert into sfis1.jobsubmit_log values(SYSDATE,DATA3);
ELSE
insert into sfis1.jobsubmit_log values(SYSDATE,DATA3);