Oracle APEX超时中断存储过程运行的技术咨询
APEX存储过程超时问题解决方案
针对你遇到的存储过程运行14分41秒后超时的问题,结合Windows Server 2019、Oracle 19.3、APEX 22.1的环境,解答如下:
1. APEX管理员设置(超时设置)是否需重启Windows服务器才生效?
不需要重启整个Windows服务器,不同层级的超时设置生效方式不同:
- APEX应用/页面级超时:保存设置后立即生效,无需重启任何服务。
- ORDS(Oracle REST Data Services)超时:修改配置后只需重启ORDS服务即可。
- IIS反向代理超时(若使用IIS):修改后重启对应IIS站点即可,无需重启服务器。
2. 如何将页面超时时间从14分41秒调整为2小时?
超时可能来自多个环节,需逐一检查调整:
APEX层面设置
- 页面级:进入目标页面的「属性」→「安全」,找到「会话超时」选项,设置为120分钟。
- 应用级:进入应用属性→「安全」→「会话超时」,设置为120分钟(此设置会覆盖页面级默认值)。
ORDS层面设置
修改ORDS配置文件(如ords/conf/ords_defaults.xml),调整以下参数:
<entry key="jdbc.max_statement_idle_time">7200</entry> <!-- 单位:秒,2小时 --> <entry key="jetty.idleTimeout">7200000</entry> <!-- 单位:毫秒,2小时 -->
修改完成后重启ORDS服务。
IIS层面设置(若使用IIS做反向代理)
打开IIS管理器,找到对应站点→「高级设置」→「连接超时」,设置为7200秒,随后重启该站点。
Oracle数据库层面设置
检查用户配置文件的IDLE_TIME参数,若其值小于2小时会导致会话提前断开,可执行以下语句修改:
ALTER PROFILE DEFAULT LIMIT IDLE_TIME 0; -- 0表示无空闲时间限制
若仅针对特定用户,替换DEFAULT为对应用户的配置文件名即可。
3. 如何设置使存储过程在超时后仍能继续运行?
要让存储过程脱离APEX会话的约束,需采用异步执行方式,推荐两种方案:
方案一:使用DBMS_SCHEDULER创建异步任务
这是Oracle 11g及以上版本的推荐方式,示例代码:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'RUN_LONG_PROC_' || TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'), job_type => 'STORED_PROCEDURE', job_action => '你的存储过程名', -- 若带参数需写成"PROC_NAME(:1,:2)"并添加job_args参数 start_date => SYSTIMESTAMP, enabled => TRUE, auto_drop => TRUE, -- 任务完成后自动删除 comments => '异步执行长耗时存储过程' ); END; /
方案二:使用DBMS_JOB(兼容旧版)
若习惯使用旧版调度工具,可执行:
DECLARE v_jobno NUMBER; BEGIN DBMS_JOB.SUBMIT( job => v_jobno, what => '你的存储过程名;', -- 结尾需加分号 next_date => SYSDATE ); COMMIT; END; /
权限说明
确保执行APEX的数据库用户拥有创建任务的权限:
GRANT CREATE JOB TO 你的APEX数据库用户名;
补充:Linux环境无超时的可能原因
Linux上同版本APEX未出现超时,大概率是因为Linux环境下ORDS或Web服务器(如Apache)的默认超时配置比Windows更长,未触发超时阈值;而Windows的IIS或ORDS默认设置更严格,导致提前断开会话。
内容的提问来源于stack exchange,提问作者dorog.zultan
相关产品推荐
相关产品推荐

