首页 > 解决方案 > 通过 oracle Apex 页面运行任何作业时出现“错误:错误 - 服务不可用”

问题描述

我通过以下方式单击按钮,通过顶点页面使用 DBMS_SCHEDULER 执行外部作业。(动态操作 => 执行 PlSql)

 dbms_scheduler.run_job(job_name => 'APEXDATA.myJobName', use_current_session=> TRUE);

它正确执行外部作业。(需要 1-2 分钟)。我的问题是,在执行期间我无法访问任何其他页面或无法使用新会话登录。显示以下错误在我执行的每项任务中。

**503 Service Unavailable
  The connection pool named: |apex|| is not correctly configured, due to the following error(s): 
  Exception occurred while getting connection: oracle.ucp.UniversalConnectionPoolException: 
  All connections in the Universal Connection Pool are in use**

这是一般问题还是已知问题?如果是,如何解决问题,因为同时其他用户还必须执行任何其他任务或其他用户可能同时登录。

谢谢你。

标签: oracle-apexoracle-apex-5oracle-apex-5.1

解决方案


我认为您正在混合难以结合的两件事:

  1. 动态操作旨在从页面提交代码而无需页面提交,因此用户可以在完成某些操作后继续在页面上工作(例如运行 pl/sql 代码)
  2. 在数据库中运行一个进程,该进程占用数据库会话,直到完成 ( use_current_session=> TRUE)。您的 dbms_scheduler.run_job 进程将在当前会话中运行,并且只要该作业正在运行,就不能在该数据库会话中运行其他操作(连接正在使用中,如错误消息中所示)。

解决方案:

  • use_current_session=> FALSE所以作业在后台运行
  • 在动态操作中,将“等待结果”设置为 true,因此用户被迫等待作业完成。
  • 在页面提交上执行作业,这也将强制用户等待作业完成。

由于您的工作需要 1-2 分钟才能完成,因此选项 2 和 3 可能不可行,因为用户体验不是最佳的。如果您在后台执行作业,那么您可能需要编写一些额外的代码来防止用户单击几次并多次提交作业。您可以通过在提交作业之前检查作业是否正在运行来做到这一点,如果它当前正在运行则不提交。


推荐阅读