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

如何管控Oracle Apex应用中的活跃会话数量?

Oracle Apex 并发连接数管控方案(18.2/23.1)

首先明确:Apex 18.2和23.1确实没有原生的并发连接数限制配置项,你通过WWV_FLOW_SESSIONS$表实现管控的思路是可行的,下面提供几个无需修改Apex自带作业的优化方案:

方案1:优化WWV_FLOW_SESSIONS$查询逻辑,绕过清理作业依赖

WWV_FLOW_SESSIONS$表本身存储了会话的超时参数,无需等待ORACLE_APEX_PURGE_SESSIONS作业清理,直接在认证流程中过滤掉已过期的会话即可得到准确的活跃会话数。

示例查询(可直接在认证前流程中调用):

DECLARE
    l_active_sessions NUMBER;
    l_max_concurrent NUMBER := 100; -- 替换为你的并发限制数
BEGIN
    SELECT COUNT(*)
    INTO l_active_sessions
    FROM WWV_FLOW_SESSIONS$
    WHERE FLOW_ID = :APP_ID
      AND USER_ID IS NOT NULL -- 过滤未完成认证的会话
      AND SYSDATE <= LAST_ACTIVITY_DATE + (SESSION_IDLE_TIMEOUT / 1440); -- 转换分钟为天,判断会话是否有效
    
    IF l_active_sessions >= l_max_concurrent THEN
        RAISE_APPLICATION_ERROR(-20001, '当前并发连接数已达上限,请稍后再试');
    END IF;
END;

这个查询会自动排除已超时的会话,完全不需要依赖Apex自带的清理作业周期,效率和准确性都有保障。

方案2:自建独立会话跟踪表,完全隔离Apex原生机制

如果不想依赖Apex的系统表,可以自建会话跟踪表,独立维护会话生命周期,完全不影响Apex自带作业:

  1. 创建自定义会话表:
CREATE TABLE MY_APP_CONCURRENT_SESSIONS (
    SESSION_ID VARCHAR2(40) PRIMARY KEY,
    APP_ID NUMBER NOT NULL,
    USER_NAME VARCHAR2(100) NOT NULL,
    LOGIN_DATE DATE DEFAULT SYSDATE,
    LAST_ACTIVITY_DATE DATE DEFAULT SYSDATE
);
  1. 在认证成功后添加流程,插入会话记录:
INSERT INTO MY_APP_CONCURRENT_SESSIONS (SESSION_ID, APP_ID, USER_NAME)
VALUES (:APP_SESSION, :APP_ID, :APP_USER);
  1. 创建应用级进程(执行时机:On Load: Before Header),更新当前会话的最后活动时间:
UPDATE MY_APP_CONCURRENT_SESSIONS
SET LAST_ACTIVITY_DATE = SYSDATE
WHERE SESSION_ID = :APP_SESSION;
  1. 在登出流程中添加删除会话记录的逻辑:
DELETE FROM MY_APP_CONCURRENT_SESSIONS
WHERE SESSION_ID = :APP_SESSION;
  1. 自建定时清理作业(用DBMS_SCHEDULER),清理超时会话:
BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        JOB_NAME => 'MY_APP_PURGE_EXPIRED_SESSIONS',
        JOB_TYPE => 'PLSQL_BLOCK',
        JOB_ACTION => '
            DELETE FROM MY_APP_CONCURRENT_SESSIONS
            WHERE LAST_ACTIVITY_DATE < SYSDATE - (30/1440); -- 30分钟超时,可根据你的会话超时设置调整
        ',
        START_DATE => SYSDATE,
        REPEAT_INTERVAL => 'FREQ=MINUTELY;INTERVAL=10', -- 每10分钟清理一次,自定义周期
        AUTO_DROP => FALSE,
        ENABLED => TRUE
    );
END;

这种方式完全独立于Apex原生会话管理,你可以自由控制清理周期,不会修改任何Apex自带组件。

方案3:数据库层面的补充限制(仅适用于独立数据库用户场景)

如果你的Apex应用是每个终端用户对应独立的数据库用户(而非共享应用用户),可以通过数据库PROFILE限制每个用户的会话数:

CREATE PROFILE APP_USER_PROFILE LIMIT SESSIONS_PER_USER 5; -- 每个用户最多5个会话
ALTER USER app_user1 PROFILE APP_USER_PROFILE;

但这种场景在Apex中比较少见,大多数情况下都是共享一个数据库用户连接,所以这个方案仅作为补充。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:04:51