Oracle 19c RAC中启用DRCP需逐实例启动池、倍增认证服务器参数、TNS连接字符串必须显式指定SERVICE_NAME和SERVER=POOLED,并确保Large Pool充足,否则将降级为专用连接。
oracle 19c rac 环境下启用 drcp(database resident connection pooling)确实能显著降低连接开销,但直接照搬单实例配置会踩坑——rac 中池状态不跨实例同步、认证服务器争用、客户端路由失效是三大高频问题。
DRCP 在 RAC 中必须显式启动每个实例的池
很多人误以为在任意一个节点执行 DBMS_CONNECTION_POOL.START_POOL() 就全局生效。实际并非如此:RAC 中每个实例维护独立的 DRCP 运行时状态,未启动的实例无法响应 POOLED 连接请求,客户端会 fallback 到专用连接,白配了池参数。
- 必须逐个登录所有 RAC 节点的 SQL*Plus(以
SYS用户),分别执行:EXEC DBMS_CONNECTION_POOL.START_POOL();
- 验证是否全部启动:
SELECT pool_name, status, maxsize, minsize FROM dba_cpool_info;
结果应显示每个实例上SYS_DEFAULT_CONNECTION_POOL的status均为ACTIVE - 若某节点重启后池未自动恢复(偶发),需检查该节点的
spfile中是否设置了drpcp_start_on_instance_startup=TRUE(19c 默认不启用)
认证服务器(Auth Server)参数必须按节点数倍增
RAC 中客户端连接首次认证由认证池完成,而认证服务器进程(ora_auth_*.ora)是单实例进程。默认 MIN_AUTH_SERVERS=1、MAX_AUTH_SERVERS=2 在多节点高并发场景下极易成为瓶颈,表现为连接卡在 authentication 阶段、gv$session 中大量 LOGON 状态会话。
- 设节点数为 N,建议将
MAX_AUTH_SERVERS设为N × 4(如 2 节点设为 8),MIN_AUTH_SERVERS设为N × 2 - 修改需重启实例生效:
ALTER SYSTEM SET MAX_AUTH_SERVERS=8 SCOPE=SPFILE SID='*';
注意SID='*'表示所有实例 - 确认生效后,查
gv$process应能看到每个节点上多个ora_auth_*进程
客户端连接字符串必须带 SERVICE_NAME 且显式指定 SERVER=POOLED
只在 TNSNAMES.ORA 里写 (SERVER=POOLED) 不够。RAC 环境下,SCAN 或 VIP 监听器默认将连接分发到任意实例,但 DRCP 池只在本实例内存中;若连接被路由到未启动池的实例,就会静默降级为专用连接,监控完全看不出异常。
- 正确 TNS 描述符必须同时满足:
– 使用SERVICE_NAME(不能用SID)
– 显式声明(SERVER=POOLED)
– 推荐绑定到具体服务名(非默认 service),便于后续限流和监控 - 示例(两节点 RAC,SCAN 名为
rac-scan,服务名为app_svc):(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=app_svc)(SERVER=POOLED)))
- Java 应用使用 UCP 时,务必设置
oracle.ucp.jdbc.PoolDataSource.setConnectionPoolName("SYS_DEFAULT_CONNECTION_POOL"),否则仍走专用连接
DRCP 与 RAC 的资源竞争点:大池(Large Pool)分配不足
DRCP 的连接上下文、会话状态缓存都从实例的 Large Pool 分配。RAC 中若未显式配置 Large Pool,系统可能从 Shared Pool 动态借用,导致共享池碎片化、硬解析飙升,尤其在连接频繁创建/销毁的 OLTP 场景。
- 检查当前 Large Pool 大小:
SHOW PARAMETER large_pool_size
若为 0 或过小( - 按连接池最大连接数预估:每 POOLED 连接约消耗 100–150KB Large Pool,设
MAXSIZE=2000至少预留large_pool_size=256M - 设置命令(需重启):
ALTER SYSTEM SET large_pool_size=256M SCOPE=SPFILE SID='*';
DRCP 在 RAC 中真正起效的关键,不是“启没启”,而是“每个实例的池是否活、认证是否够、路由是否准、内存是否稳”。漏掉任一环,连接池就只是个透明摆设——看起来配置全对,实则流量全走专用通道,资源消耗照旧。











