我确实想出了解决这个问题的办法。所以我决定分享它,以防你有类似的问题。
首先让我进一步解释问题,然后分享解决方案。
问题是:我在 JPA 中使用连接池连接到数据库,并使用 JPA 注释在数据库上执行过程(我在应用程序端的单独线程中执行过程)。该查询正在处理生成大量报告的事务,因此执行需要一些时间。无论出于何种原因,从池中获得的数据库连接被破坏,即使数据库过程没有完成,但它也没有失败,因此至少它释放了它手头的资源.
解决方案:
简短的回答是:我创建了另一个过程(包装过程),它创建并启动 dbms_schedule 运行 dbms_schedule program 的作业(带有一些随机名称),该 program 运行主程序。由于包装程序在几毫秒内完成,它不会长时间阻塞数据库连接,因此它可能会失败。
长答案:
第 1 步:创建程序。
BEGIN
DBMS_SCHEDULER.create_program(
program_name => 'DBUSER.PROG_NAME',
program_action => 'DBUSER.MAIN_REPORT',
program_type => 'STORED_PROCEDURE',
number_of_arguments => 1, //number of passed arguments to procedure
comments => NULL,
enabled => FALSE);
//Do this for each argument
DBMS_SCHEDULER.define_program_argument(
program_name => 'DBUSER.PROG_NAME',
argument_name => NULL,
argument_position => 1,
argument_type => 'VARCHAR2',
out_argument => FALSE);
passing procedure arguments
DBMS_SCHEDULER.ENABLE(name=>'DBUSER.PROG_NAME');
END;
第 2 步:创建 包装程序。
create or replace PROCEDURE WRAPPER_PROC
(
FIRST_ARG IN VARCHAR2
)
IS
job_name_var VARCHAR2(20);
BEGIN
//creating a random job-name
select DBMS_SCHEDULER.generate_job_name ('TEMP_JOB_') INTO job_name_var from dual;
//creating the job
dbms_scheduler.create_job(job_name => job_name_var ,
program_name => 'PROG_NAME',
start_date => systimestamp,
auto_drop => true,
repeat_interval => null,
end_date => null);
//passing the argument to job
dbms_scheduler.set_job_argument_value(job_name_var, 1, FIRST_ARG);
//specifying the the dbms should drop the job after it has run
dbms_scheduler.set_attribute(job_name_var,'max_runs',1);
dbms_scheduler.enable(job_name_var);
DBMS_OUTPUT.put_line('Job has successfully created');
END WRAPPER_PROC;
希望对你有帮助!