如何在Oracle中多次(并行)执行相同的作业?

时间:2013-11-05 05:05:01

标签: c# .net oracle email job-scheduling

我在后端安排了一份工作(用于发送电子邮件),使用DBMS_Scheduler。但是,要求允许用户安排电子邮件,并允许他们在点击按钮时立即发送电子邮件

为实现这一目标,我做了以下安排:当用户点击按钮时,会调用一个过程。该过程执行上面提到的作业(使用run_job)。这使我能够使用相同的工作立即发送电子邮件,并在预定的时间发送电子邮件。

我现在面临的问题是:假设用户A点击了按钮。同时,用户B点击他系统上的按钮。然后用户B收到以下错误消息:作业已在运行。

如何在Oracle中多次执行相同作业并行)?

2 个答案:

答案 0 :(得分:2)

DBMS_SCHEDULER.RUN参数USE_CURRENT_SESSION设置为TRUE

--Create a test job.
begin
    dbms_scheduler.create_job(
        job_name => 'TEST_JOB',
        job_type => 'PLSQL_BLOCK',
        job_action => 'BEGIN dbms_lock.sleep(3); END;');
end;
/

--This fails if run concurrently. 
begin
    dbms_scheduler.run_job(job_name => 'TEST_JOB', use_current_session => FALSE);
end;
/

--This can run concurrently.
begin
    dbms_scheduler.run_job(job_name => 'TEST_JOB', use_current_session => TRUE);
end;
/

答案 1 :(得分:1)

如果您可以将作业转换为基于事件的作业,则可以使用轻量级作业来响应触发它们的事件。对于基于事件的作业,您可以将parallel_instances设置为true,从而允许同一作业的多个实例并行运行。

这是做你想做的事的方法。

轻量级并行工作旨在成为简单任务的短期工作。