Oracle 数据库连接池优化
Oracle 数据库连接池优化
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
数据库连接池优化[1]:
问题:
- 连接建立开销
- 进程数限制
- 内存消耗
2. 共享服务器
2.1 配置
ALTER SYSTEM SET shared_servers = 10;
ALTER SYSTEM SET max_shared_servers = 100;
ALTER SYSTEM SET shared_server_sessions = 200;
ALTER SYSTEM SET dispatchers = '(PROTOCOL=tcp)(DISPATCHERS=3)';
2.2 客户端
# tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = ...)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SERVER = SHARED)
)
)
2.3 适用
- 大量连接
- 短查询
- 不适合长事务
详细见:Oracle 网络性能优化。
3. DRCP
3.1 启用
ALTER SYSTEM SET enable_drcp = TRUE;
EXEC DBMS_CONNECTION_POOL.START_POOL;
EXEC DBMS_CONNECTION_POOL.ALTER_PARAM(NULL, 'MINSIZE', 10);
EXEC DBMS_CONNECTION_POOL.ALTER_PARAM(NULL, 'MAXSIZE', 100);
EXEC DBMS_CONNECTION_POOL.ALTER_PARAM(NULL, 'INACTIVITY_TIMEOUT', 300);
3.2 客户端
# tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = ...)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(SERVER = POOLED)
)
)
3.3 优势
- 大量连接
- 资源共享
- 兼容 OCI
3.4 监控
SELECT * FROM dba_cpool_info;
SELECT * FROM v$cpool_conn_info;
SELECT * FROM v$cpool_stats;
4. 应用连接池
4.1 OCI
- Session Pooling
- Connection Pooling
4.2 JDBC
// HikariCP
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
4.3 UCP(Universal Connection Pool)
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//host:1521/svc");
pds.setInitialPoolSize(5);
pds.setMinPoolSize(5);
pds.setMaxPoolSize(20);
5. 连接数估算
5.1 公式
并发用户 / 单用户连接 = 连接数
并发请求 * 平均查询时间 = 连接数
5.2 示例
1000 并发用户
单用户 1 连接
= 1000 连接
或
1000 并发请求
平均查询 100ms
= 100 连接
6. 进程数配置
6.1 PROCESSES
ALTER SYSTEM SET processes = 500 SCOPE=SPFILE;
-- 至少 = 应用连接 + 后台进程 + 50
6.2 SESSIONS
ALTER SYSTEM SET sessions = 750 SCOPE=SPFILE;
-- = processes * 1.5 + 22
7. 内存优化
7.1 共享服务器
- 减少 PGA
- 共享 UGA
7.2 DRCP
- 共享服务器进程
- 减少 PGA
7.3 专用服务器
- 每连接独立 PGA
- 内存消耗大
8. 连接稳定性
8.1 TAF(Transparent Application Failover)
# tnsnames.ora
ORCL = (FAILOVER=ON)(LOAD_BALANCE=ON)
(ADDRESS=...)
(CONNECT_DATA=(SERVICE_NAME=orcl)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)))
8.2 FCF(Fast Connection Failover)
// UCP
pds.setFastConnectionFailoverEnabled(true);
pds.setONSConfiguration("nodes=...:6200");
8.3 连接验证
// 验证连接有效
config.setConnectionTestQuery("SELECT 1 FROM dual");
config.setConnectionTimeout(30000);
9. 监控
9.1 连接数
SELECT
COUNT(*) AS total,
SUM(CASE WHEN server = 'DEDICATED' THEN 1 ELSE 0 END) AS dedicated,
SUM(CASE WHEN server = 'SHARED' THEN 1 ELSE 0 END) AS shared,
SUM(CASE WHEN server = 'POOLED' THEN 1 ELSE 0 END) AS pooled
FROM v$session
WHERE username IS NOT NULL;
9.2 进程数
SELECT
COUNT(*) AS processes,
value AS limit
FROM v$process p, v$parameter v
WHERE v.name = 'processes'
GROUP BY value;
9.3 DRCP
SELECT * FROM v$cpool_stats;
10. 常见坑与排错
10.1 ORA-12520
-- listener could not find available handler
-- 1. 增加 PROCESSES
-- 2. 共享服务器
-- 3. DRCP
10.2 ORA-00020
-- maximum number of processes exceeded
-- 1. 增加 PROCESSES
-- 2. 连接池
-- 3. 杀掉空闲连接
10.3 连接泄漏
- 应用未关闭连接
- 监控空闲会话
- 超时配置
11. 最佳实践
- 应用连接池:基础
- UCP/Druid:JDBC
- DRCP:大量 OCI 连接
- 共享服务器:通用
- PROCESSES 充足:避免拒绝
- 连接验证:稳定
- 超时配置:避免泄漏
- TAF/FCF:高可用
- 监控连接数:及时
- 负载均衡:RAC
12. 参考资料
[1] Oracle Database Net Services Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/