DRCP是Oracle数据库内置的服务器端连接池,由数据库自身管理空闲连接,专为高并发短连接场景优化;与应用层连接池(如HikariCP)本质区别在于:DRCP在数据库侧复用服务器进程,减少PGA开销和进程创建成本,而应用层池仅在JVM内存中缓存连接对象,不涉及数据库进程复用。
DRCP 是什么,和应用层连接池有什么区别
database resident connection pool(drcp)是 oracle 12c 内置在数据库实例里的连接池机制,由数据库自身管理空闲连接,不是 java 应用里配的 hikaricp 或 druid。它解决的是「大量短连接反复建连」带来的 pga 消耗和进程创建开销,适用于 web 应用中连接生命周期极短、并发连接数波动大的场景。
关键区别在于:DRCP 连接由数据库后台进程 CMON 统一调度,客户端通过带 :POOLED 后缀的服务名连接;而 HikariCP 等是在应用内存里维护连接对象,不涉及数据库侧进程复用。两者可共存,但不能混用同一连接串。
启用 DRCP 的必要步骤和权限要求
DRCP 默认关闭,必须由具有 ALTER SYSTEM 权限的用户(如 SYS)手动启动。常见错误是直接运行 DBMS_CONNECTION_POOL.START_POOL 却没检查依赖状态或权限。
- 确认数据库已启用共享服务器模式(
SHARED_SERVERS > 0),否则 DRCP 启动失败 - 执行:
BEGIN DBMS_CONNECTION_POOL.START_POOL(); END; - 若报错
ORA-56601: connection pool is not configured,需先运行配置命令:EXEC DBMS_CONNECTION_POOL.CONFIGURE_POOL(NULL, MINSIZE => 4, MAXSIZE => 40, INCRSIZE => 2) - 验证是否启用:
SELECT * FROM V$CPOOL_STATS;—— 若返回空行说明未启动
Java 应用如何正确连接到 DRCP
Java 端不需要改连接池实现,只需调整 JDBC URL 并确保驱动支持。Oracle 12c+ 的 ojdbc8.jar 支持 DRCP,但 URL 格式必须显式声明 pooled 服务名,且不能与非 pooled 服务名混用。
- JDBC URL 示例:
jdbc:oracle:thin:@//host:1521/ORCLPDB:POOLED—— 注意末尾的:POOLED是必需的,不是可选参数 - 旧写法
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=...))(CONNECT_DATA=(SERVICE_NAME=ORCLPDB)(SERVER=POOLED)))在 12c+ 已不推荐,易因括号嵌套出错 - HikariCP 的
connection-timeout依然只控制从池取连接的等待时间,DRCP 层面的连接建立延迟由数据库参数CONNECTION_BROKER_TIMEOUT控制(默认 60 秒) - 务必禁用
connection-test-query,DRCP 连接不支持SELECT 1 FROM DUAL校验,会触发 ORA-56609
DRCP 容易被忽略的资源泄漏点
DRCP 连接归还行为和普通连接不同:它不自动清理会话级上下文(如临时表、绑定变量缓存、NLS 设置)。如果应用每次连接都执行 ALTER SESSION SET NLS_DATE_FORMAT=... 或创建全局临时表,这些状态会残留并污染后续复用连接。
- 避免在连接初始化时执行会话级 DDL 或 DCL(如
CREATE GLOBAL TEMPORARY TABLE) - 不要依赖
autoCommit=false配置来控制事务边界 —— DRCP 连接复用后,上一个事务可能仍处于未提交状态,导致 ORA-00060 - 监控
V$CPOOL_CONN_INFO中的IN_USE和WAITING列,持续增长说明应用未正确 close() PreparedStatement/Connection - DRCP 的最大连接数受
MAXSIZE和数据库PROCESSES参数双重限制,调高前者前必须确认后者足够(例如PROCESSES=300才能支撑MAXSIZE=200)


















