Oracle 共享服务器(Shared Server)架构
Oracle 共享服务器(Shared Server)架构
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
共享服务器(Shared Server) 是 Oracle 的多路复用连接模式[1],多个客户端共享少量服务器进程:
适用场景:
- 大量短连接
- 连接数远超实际并发
- Web 应用
- OLTP 短查询
不适用场景:
- 长查询(DBA 操作)
- 大数据量传输
- 批处理作业
2. 工作模型
2.1 专用 vs 共享
专用服务器(Dedicated Server):
Client1 → Server Process 1
Client2 → Server Process 2
Client3 → Server Process 3
...
ClientN → Server Process N
共享服务器(Shared Server):
Client1 ─┐
Client2 ─┼─> Dispatcher ─> Request Queue ─> Shared Server 1
Client3 ─┤ ─> Shared Server 2
ClientN ─┘ └> Shared Server 3
└> Response Queue ─> Dispatcher ─> Client
2.2 工作流程
1. 客户端连接到 Dispatcher(不是 Server Process)
2. 客户端请求放入 Request Queue
3. Shared Server 从 Request Queue 取请求处理
4. 处理结果放入 Response Queue
5. Dispatcher 从 Response Queue 取结果返回客户端
3. 配置共享服务器
3.1 启用共享服务器
-- 基本配置
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 shared_server_sessions=200 SCOPE=BOTH;
ALTER SYSTEM SET circuits=300 SCOPE=BOTH;
3.2 参数详解
| 参数 | 说明 |
|---|---|
| shared_servers | 初始 Shared Server 数量 |
| max_shared_servers | 最大 Shared Server 数量 |
| dispatchers | Dispatcher 配置 |
| shared_server_sessions | 共享服务器最大会话数 |
| circuits | 虚拟电路数 |
| max_dispatchers | 最大 Dispatcher 数 |
3.3 Dispatcher 配置
-- 单协议
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=3)' SCOPE=BOTH;
-- 多协议
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=3)', '(PROTOCOL=TCPS)(DISPATCHERS=1)' SCOPE=BOTH;
-- 指定监听器
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=3)(LISTENER=LISTENER2)' SCOPE=BOTH;
3.4 关闭共享服务器
ALTER SYSTEM SET shared_servers=0 SCOPE=BOTH;
-- 已有共享会话不受影响,新连接为专用
4. 客户端连接
4.1 tnsnames.ora 配置
# 共享服务器连接
ORCL_SHARED =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = SHARED) # 指定共享
(SERVICE_NAME = orcl)
)
)
# 专用服务器连接
ORCL_DEDICATED =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED) # 指定专用
(SERVICE_NAME = orcl)
)
)
# 默认(取决于服务配置)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
4.2 连接
# 共享连接
sqlplus scott/tiger@orcl_shared
# 专用连接
sqlplus scott/tiger@orcl_dedicated
4.3 服务级别配置
-- 创建服务,强制共享
BEGIN
DBMS_SERVICE.MODIFY_SERVICE(
service_name => 'oltp_svc',
shared_server => 1 -- 强制共享
);
END;
/
-- 创建服务,强制专用
BEGIN
DBMS_SERVICE.MODIFY_SERVICE(
service_name => 'batch_svc',
shared_server => 0 -- 强制专用
);
END;
/
5. 监控共享服务器
5.1 Dispatcher 信息
SELECT
name,
network,
status,
idle,
busy,
bytes,
breaks
FROM v$dispatcher;
5.2 Shared Server 信息
SELECT
name,
status,
idle,
busy,
requests,
bytes
FROM v$shared_server;
5.3 Queue 信息
SELECT
name,
type,
queued,
totalq,
wait
FROM v$queue;
5.4 共享服务器会话
SELECT
username,
server,
program
FROM v$session
WHERE server IN ('SHARED', 'NONE');
-- server='NONE' 表示等待 Shared Server
5.5 Circuit 信息
SELECT
circuit,
dispatcher,
server,
waiter,
status
FROM v$circuit;
6. 共享服务器调优
6.1 Dispatcher 数量
-- 查看 Dispatcher 忙碌程度
SELECT
name,
busy / (busy + idle) * 100 AS busy_pct
FROM v$dispatcher
ORDER BY busy DESC;
-- busy_pct > 50% 考虑增加 Dispatcher
-- 增加 Dispatcher
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=5)' SCOPE=BOTH;
6.2 Shared Server 数量
-- 查看 Shared Server 忙碌程度
SELECT
name,
busy / (busy + idle) * 100 AS busy_pct,
requests
FROM v$shared_server
ORDER BY busy DESC;
-- 查看 Queue 等待
SELECT
type,
queued,
wait
FROM v$queue
WHERE type='COMMON';
-- wait 高考虑增加 Shared Server
-- 增加 Shared Server
ALTER SYSTEM SET shared_servers=10 SCOPE=BOTH;
ALTER SYSTEM SET max_shared_servers=30 SCOPE=BOTH;
6.3 Queue 等待
-- Request Queue 等待高
SELECT
type,
totalq,
queued,
wait
FROM v$queue;
-- wait > 1 秒,增加 Shared Server
6.4 内存配置
-- 共享服务器需要更大的 Shared Pool
-- 用于 User Global Area (UGA)
ALTER SYSTEM SET shared_pool_size=2G SCOPE=BOTH;
-- Large Pool 也用于 UGA
ALTER SYSTEM SET large_pool_size=512M SCOPE=BOTH;
7. 共享服务器 vs DRCP
7.1 对比
| 维度 | Shared Server | DRCP |
|---|---|---|
| 粒度 | SQL 语句级 | 会话级 |
| 复用 | 多客户端轮流 | 池化复用 |
| 适用 | 中等连接数 | 海量短连接 |
| 客户端 | OCI/JDBC | OCI/JDBC thin |
| 进程 | Dispatcher + Shared Server | Broker + Pool Server |
| 11g+ | 支持 | 支持 |
7.2 选择建议
- 1000 以下连接:Shared Server
- 1000+ 连接:DRCP
- 混合:DRCP + Shared Server
详细内容见:Oracle 连接池与 DRCP。
8. 共享服务器限制
8.1 不支持的操作
- DBA 操作:STARTUP/SHUTDOWN
- 备份恢复:RMAN
- 长查询:大数据量导出
- 批处理:长事务
8.2 切换到专用
# DBA 连接用专用
sqlplus / as sysdba
# 默认专用(本地连接)
# 远程 DBA 连接
sqlplus sys/pwd@orcl_dedicated as sysdba
9. 常见坑与排错
9.1 ORA-12516: 监听器找不到可用 handler
现象:连接报 ORA-12516。
修复:
-- 1. 检查 Shared Server 数量
SHOW PARAMETER shared_servers;
-- 2. 增加 Shared Server
ALTER SYSTEM SET shared_servers=10 SCOPE=BOTH;
ALTER SYSTEM SET max_shared_servers=30 SCOPE=BOTH;
-- 3. 检查 Dispatcher
SHOW PARAMETER dispatchers;
9.2 ORA-12520: 监听器找不到可用 handler
现象:专用连接被拒绝。
修复:
-- 增大 PROCESSES
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
-- 重启生效
9.3 共享服务器性能差
现象:响应慢。
修复:
-- 1. 检查 Queue 等待
SELECT type, queued, wait FROM v$queue;
-- 2. 增加 Shared Server
ALTER SYSTEM SET shared_servers=15 SCOPE=BOTH;
-- 3. 增大 Shared Pool
ALTER SYSTEM SET shared_pool_size=4G SCOPE=BOTH;
9.4 长查询卡住
现象:长查询在共享服务器下表现差。
修复:
# 长查询用专用连接
sqlplus scott/tiger@orcl_dedicated
9.5 Dispatcher 忙碌
现象:响应慢,Dispatcher busy% 高。
修复:
-- 增加 Dispatcher
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=5)' SCOPE=BOTH;
10. 最佳实践
- OLTP 短连接用共享服务器:减少进程
- DBA 操作用专用:避免共享限制
- 监控 Queue 等待:及时扩容
- Shared Pool 增大:UGA 占用
- 合理 Dispatcher 数:连接数 / 1000
- 合理 Shared Server 数:并发数 * 1.5
- 服务级别配置:不同业务不同模式
- 结合 DRCP:海量连接
- 监控 v$session:发现异常
- 生产前压测:验证配置
11. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Managing Shared Server” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-processes.html
[2] Oracle Database Net Services Administrator’s Guide 19c, “Shared Server Architecture” https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/