Oracle 进程模型:专用服务器 vs 共享服务器
Oracle 进程模型:专用服务器 vs 共享服务器
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 进程模型决定了客户端如何与实例交互,主要有两种[1]:
| 模型 | 客户端连接 | 进程数 | 适用场景 |
|---|---|---|---|
| 专用服务器(Dedicated) | 1 客户端 : 1 服务进程 | 多 | OLTP、长事务 |
| 共享服务器(Shared) | N 客户端 : M 服务进程 | 少 | 大量短连接、Web 应用 |
2. 专用服务器(Dedicated Server)
2.1 工作模型
客户端 1 ──> Server Process 1 ──> SGA
客户端 2 ──> Server Process 2 ──> SGA
客户端 3 ──> Server Process 3 ──> SGA
每个客户端连接都对应一个独立的服务进程,进程独占 PGA。
2.2 连接流程
1. 客户端通过 listener 发起连接
2. Listener 接受连接,fork 一个 Server Process
3. Server Process 接管连接
4. 客户端与 Server Process 直接通信
5. 客户端断开时,Server Process 退出
2.3 配置
默认即为专用服务器模式,无需特殊配置。
# tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED) # 显式指定
(SERVICE_NAME = orcl)
)
)
2.4 优缺点
优点:
- 实现简单
- 性能好(无调度开销)
- 适合长事务、批量操作
- 排错简单
缺点:
- 每个连接占用一个进程,连接数受限
- 内存消耗大(每个 PGA 独立)
- 不适合海量短连接
3. 共享服务器(Shared Server)
3.1 工作模型
客户端 1 ─┐
客户端 2 ─┼─> Dispatcher ─> Request Queue ─> Shared Server 1
客户端 3 ─┤ ─> Shared Server 2
客户端 4 ─┘ ─> Shared Server 3
└> Response Queue ─> Dispatcher ─> 客户端
3.2 关键组件
| 组件 | 作用 |
|---|---|
| Dispatcher(调度器) | 接收客户端请求,放入请求队列 |
| Request Queue | 请求队列(共享) |
| Shared Server Process | 共享服务进程,从队列取请求处理 |
| Response Queue | 响应队列(每个 Dispatcher 一个) |
| Virtual Circuit | 虚拟电路,Dispatcher 与 Server 通信缓冲区 |
3.3 配置
-- 设置共享服务器参数
ALTER SYSTEM SET shared_servers=5 SCOPE=BOTH;
ALTER SYSTEM SET max_shared_servers=20 SCOPE=BOTH;
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=3)' SCOPE=BOTH;
ALTER SYSTEM SET max_dispatchers=10 SCOPE=BOTH;
-- 启用共享服务器
ALTER SYSTEM SET shared_server_sessions=200 SCOPE=BOTH;
# tnsnames.ora
ORCL_SHARED =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = SHARED) # 指定共享服务器
(SERVICE_NAME = orcl)
)
)
3.4 优缺点
优点:
- 支持海量连接(数千甚至数万)
- 减少进程数,降低内存消耗
- 适合 Web 短连接场景
缺点:
- 调度开销(请求排队)
- 不适合长事务(占用 Shared Server 时间长)
- DBA 操作受限(部分操作必须用专用连接)
- 排错复杂
4. 共享服务器注意事项
4.1 必须使用专用服务器的操作
- STARTUP / SHUTDOWN
- RMAN 备份恢复
- 部分DBA命令
- 批量导入导出
4.2 不适合共享服务器的场景
- 长事务(占用 Shared Server 时间长)
- 大量 BLOB 操作(占用 UGA)
- 需要会话状态的业务
5. 连接池(DRCP)
Database Resident Connection Pooling(DRCP) 是 11g 引入的更高效的连接池机制[2]:
客户端 1 ─┐
客户端 2 ─┼─> Connection Broker ─> Pool Servers(默认 4-100)
客户端 3 ─┤
客户端 N ─┘
DRCP vs 共享服务器对比:
| 维度 | 共享服务器 | DRCP |
|---|---|---|
| 粒度 | SQL 语句级 | 会话级 |
| 适用 | 中等连接数 | 海量短连接 |
| 客户端支持 | 需配置 tnsnames | OCI/JDBC 直接支持 |
| 服务器复用 | 多个客户端轮流使用 | 池化复用 |
-- 启用 DRCP
EXEC DBMS_CONNECTION_POOL.START_POOL;
-- 配置池参数
EXEC DBMS_CONNECTION_POOL.ALTER_PARAM(
param_name => 'MINSIZE',
param_value => '4'
);
EXEC DBMS_CONNECTION_POOL.ALTER_PARAM(
param_name => 'MAXSIZE',
param_value => '100'
);
6. 相关视图
-- 专用服务器连接
SELECT
s.sid, s.serial#, s.username, s.server,
p.program, p.spid
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.username IS NOT NULL
AND s.server = 'DEDICATED';
-- 共享服务器信息
SELECT name, status, messages, idle, busy
FROM v$shared_server;
-- Dispatcher 信息
SELECT name, status, messages, idle, busy, bytes
FROM v$dispatcher;
-- 请求队列
SELECT * FROM v$queue;
-- DRCP 状态
SELECT connection_pool, status, MINSIZE, MAXSIZE
FROM dba_cpool_info;
7. 常见坑与排错
7.1 连接数过多:ORA-00020
现象:ORA-00020: maximum number of processes exceeded。
排查:
SHOW PARAMETER processes;
SELECT COUNT(*) FROM v$process;
SELECT COUNT(*) FROM v$session;
修复:
-- 1. 增大 processes
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
-- 重启生效
-- 2. 或使用共享服务器/DRCP 减少进程数
ALTER SYSTEM SET shared_servers=5 SCOPE=BOTH;
7.2 共享服务器响应慢
现象:共享服务器模式下查询延迟大。
排查:
-- 检查 Shared Server 状态
SELECT name, status, requests, busy, idle
FROM v$shared_server;
-- 检查请求队列等待
SELECT * FROM v$queue
WHERE type = 'COMMON';
-- 检查等待事件
SELECT event, total_waits, time_waited
FROM v$system_event
WHERE event LIKE '%queue%';
修复:
-- 增加 Shared Server 数量
ALTER SYSTEM SET shared_servers=10 SCOPE=BOTH;
ALTER SYSTEM SET max_shared_servers=50 SCOPE=BOTH;
7.3 DRCP 连接被拒绝
现象:ORA-56609: DRCP not started。
修复:
-- 启动 DRCP
EXEC DBMS_CONNECTION_POOL.START_POOL;
-- 查看状态
SELECT status FROM dba_cpool_info;
8. 最佳实践
- OLTP 默认用专用服务器:性能与稳定性最佳
- 海量短连接用 DRCP:比共享服务器更高效
- 共享服务器限制使用:仅用于中等连接数场景
- DBA 操作用专用连接:避免共享服务器限制
- 合理设置 processes 参数:根据峰值连接数 + 后台进程预留
- 使用连接池中间件:如 Tomcat JDBC、HikariCP,减少数据库压力
9. 参考资料
[1] Oracle Database Concepts 19c, “Processes and Threads” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/process-architecture.html
[2] Oracle Database Administrator’s Guide 19c, “Managing Shared Server” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-processes.html