You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX 5.1服务器因APEX_PUBLIC_USER大量会话崩溃求解决方案

APEX_PUBLIC_USER大量会话导致服务器崩溃的解决方案

我有一台安装了Oracle APEX 5.1的Oracle数据库,之前运行状态良好。近期服务器因APEX_PUBLIC_USER用户生成大量会话而崩溃,删除这些会话后它们仍会重新生成。当前该用户执行的语句如下:

/* Formatted on 30/12/2022 05:19:20 p. m. (QP5 v5.336) */
DECLARE
    rc__             NUMBER;
    simple_list__    OWA_UTIL.vc_arr;
    complex_list__   OWA_UTIL.vc_arr;
BEGIN
    OWA.init_cgi_env ( :n__, :nm__, :v__);
    HTP.HTBUF_LEN := 63;
    NULL;
    NULL;
    simple_list__ (1) := 'sys.%';
    simple_list__ (2) := 'dbms\_%';
    simple_list__ (3) := 'utl\_%';
    simple_list__ (4) := 'owa\_%';
    simple_list__ (5) := 'owa.%';
    simple_list__ (6) := 'htp.%';
    simple_list__ (7) := 'htf.%';
    simple_list__ (8) := 'wpg_docload.%';
    simple_list__ (9) := 'ctxsys.%';
    simple_list__ (10) := 'mdsys.%';

    IF (   (wwv_flow_epg_include_modules.authorize ('wwv_flow.ajax') = FALSE)
        OR (owa_match.match_pattern (p_string              => 'wwv_flow.ajax'/* */
                                                                             ,
                                     p_simple_pattern      => simple_list__,
                                     p_complex_pattern     => complex_list__,
                                     p_use_special_chars   => FALSE)))
    THEN
        rc__ := 2;
    ELSE
        NULL;
        NULL;
        wwv_flow.ajax (p_flow_id        => :p_flow_id,
                       p_flow_step_id   => :p_flow_step_id,
                       p_instance       => :p_instance,
                       p_debug          => :p_debug,
                       p_request        => :p_request,
                       p_json           => :p_json);

        IF (WPG_DOCLOAD.is_file_download)
        THEN
            rc__ := 1;
            WPG_DOCLOAD.get_download_file ( :doc_info);
            NULL;
            NULL;
            NULL;
            COMMIT;
        ELSE
            rc__ := 0;
            NULL;
            NULL;
            NULL;
            COMMIT;
            OWA.get_page ( :data__, :ndata__);
        END IF;
    END IF;

    :rc__ := rc__;
END;

可行解决方案

  • 定位会话来源
    执行以下SQL查询会话发起信息,区分合法请求与异常连接:

    SELECT s.sid, s.serial#, s.machine, s.program, s.module, s.action
    FROM v$session s
    WHERE s.username = 'APEX_PUBLIC_USER';
    

    通过machine和program字段判断:如果是恶意扫描,直接在防火墙或Web层拦截对应IP;如果是合法APEX请求,继续排查应用或配置问题。

  • 限制会话数量与超时

    • 为APEX_PUBLIC_USER创建专属配置文件并设置会话上限:
      CREATE PROFILE apex_public_profile LIMIT SESSIONS_PER_USER 40; -- 数值根据服务器负载调整
      ALTER USER APEX_PUBLIC_USER PROFILE apex_public_profile;
      
    • 登录APEX管理界面进入实例设置,将会话超时时间从默认120分钟缩短至30分钟以内,减少闲置会话堆积。
  • 优化嵌入式PL/SQL网关(EPG)配置
    检查并调整EPG连接参数:

    -- 查询当前最大连接数
    SELECT dbms_epg.get_attribute('max_connections') FROM dual;
    -- 调整为适配服务器资源的值
    EXEC dbms_epg.set_attribute('max_connections', '30');
    

    同时确认EPG模块授权配置,确保仅允许合法的APEX模块调用,避免未授权请求占用资源。

  • 排查应用代码问题
    大量AJAX请求可能源于应用不合理逻辑:

    • 检查高频自动刷新组件(如定时器、实时报表),调整刷新间隔或优化逻辑
    • 确认AJAX请求的错误处理机制,避免请求失败后重复发起
    • 优化前端代码,减少不必要的AJAX调用次数

是否需要迁移数据库或升级APEX版本?

  • 无需立即迁移数据库,优先通过上述配置调整和问题排查解决当前问题。
  • APEX 5.1已停止官方补丁支持多年,存在性能瓶颈和安全漏洞。如果上述方案无法彻底解决会话堆积问题,建议升级至最新稳定版APEX(如23.x)——新版本在会话管理、资源优化和安全性上有显著提升。升级前务必做好数据库备份,并完成应用兼容性测试。

内容的提问来源于stack exchange,提问作者Miguel Valentin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:20:08