(2007年就有了,只是最近涉及,才略有关注。是以记录之)
根据DRCP的技术白皮书介绍,凡是使用OCI, OCCI, JDBC, ODP.NET等方式进行连接的应用都可以充分利用DRCP功能,最为典型的,估计就是Apache+PHP之类单线程应用。

DRCP简单配置:
BEGIN
-- 通过DBMS_CONNECTION_POOL包配置默认的SYS_DEFAULT_CONNECTION_POOL
DBMS_CONNECTION_POOL.CONFIGURE_POOL(POOL_NAME => NULL,
MINSIZE => 10,
MAXSIZE => 100,
INCRSIZE => 2,
SESSION_CACHED_CURSORS => 20,
INACTIVITY_TIMEOUT => 300,
MAX_THINK_TIME => 600,
MAX_USE_SESSION => 500000,
MAX_LIFETIME_SESSION => 86400);
-- 启动。也可以略过上述配置直接启动默认连接池
DBMS_CONNECTION_POOL.START_POOL();
-- 停止
DBMS_CONNECTION_POOL.STOP_POOL();
END;
几张有用的视图:
1. DBA_CPOOL_INFO 连接池状态和配置信息
2. V$CPOOL_STATS 连接池统计信息
3. V$CPOOL_CC_STATS 连接池分类统计信息
再对TNSNAMES.ORA进行调整,加上SERVER=POOLED,表示连接到连接池而不是DEDICATED方式:
MYAPP =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = myapp.example.com)
(SERVER=POOLED)
)
)
PHP简单配置:
PHP需要启用php_oci8_11g这个extension,在php.ini有针对DRCP的配置项
; Connection: Set this to a user chosen connection class to be used
; for all pooled server requests with Oracle 11g Database Resident
; Connection Pooling (DRCP). To use DRCP, this value should be set to
; the same string for all web servers running the same application,
; the database pool must be configured, and the connection string must
; specify to use a pooled server.
oci8.connection_class =MYPHP
connection_class用于区分连接分类,可以跨应用使用同一个分类。如果不指定connection_class,则系统会自动分配一个唯一标识,但这样会导致多个应用使用同样认证信息的情况下,会启用多个分类,无法共享session池。
Oracle给出了一个统计数据:假设每个session需要400K内存,每个服务器进程需要4M内存,连接池和shared server大小都是100,在5000个客户端连接的情况下,内存使用数据如下:
Dedicated Server Memory used = 5000 X (400 KB + 4 MB) = 22 GB
Shared Server Memory used = 5000 X 400 KB + 100 X 4 MB = 2.5 GB
DRCP Memory used = 100 X (400 KB + 4 MB) + (5000 X 35KB)= 615 MB
在没有应用层连接池的环境下,启用DRCP是一个非常有益的尝试。