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 数量
dispatchersDispatcher 配置
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 ServerDRCP
粒度SQL 语句级会话级
复用多客户端轮流池化复用
适用中等连接数海量短连接
客户端OCI/JDBCOCI/JDBC thin
进程Dispatcher + Shared ServerBroker + 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. 最佳实践

  1. OLTP 短连接用共享服务器:减少进程
  2. DBA 操作用专用:避免共享限制
  3. 监控 Queue 等待:及时扩容
  4. Shared Pool 增大:UGA 占用
  5. 合理 Dispatcher 数:连接数 / 1000
  6. 合理 Shared Server 数:并发数 * 1.5
  7. 服务级别配置:不同业务不同模式
  8. 结合 DRCP:海量连接
  9. 监控 v$session:发现异常
  10. 生产前压测:验证配置

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/