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. 最佳实践

  1. 应用连接池:基础
  2. UCP/Druid:JDBC
  3. DRCP:大量 OCI 连接
  4. 共享服务器:通用
  5. PROCESSES 充足:避免拒绝
  6. 连接验证:稳定
  7. 超时配置:避免泄漏
  8. TAF/FCF:高可用
  9. 监控连接数:及时
  10. 负载均衡:RAC

12. 参考资料

[1] Oracle Database Net Services Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/