oracle 19c默认为专用服务器模式,启用共享服务器必须显式设置shared_servers>0(唯一强制参数),否则即使配置dispatchers也无效;客户端还需在连接描述符中指定server=shared,且uga内存需通过共享池或大型池合理分配。

Oracle 19c 默认是专用服务器(DEDICATED)模式,不改参数就永远用不上共享服务器;想切到 SHARED 模式,必须显式设置 SHARED_SERVERS > 0,其他参数可选但不设也行。
必须设 SHARED_SERVERS 且大于 0
这是唯一强制参数。只要它为 0 或没配,数据库启动后就是纯专用模式,哪怕你后续加了 DISPATCHERS 也没用。
-
SHARED_SERVERS=5表示启动时至少拉起 5 个共享服务器进程,PMON 不会把它杀到 5 以下 - 可以动态改:
ALTER SYSTEM SET SHARED_SERVERS = 8 SCOPE=BOTH;,改完立刻生效,不用重启 - 如果只写在 pfile/spfile 里但没执行
ALTER SYSTEM,要等下次重启才生效 - 值太小(比如设成 1)会导致高并发时请求排队,
V$QUEUE里WAIT列会持续非零
DISPATCHERS 要配对协议和端口
没有 dispatcher,客户端连不进共享服务架构——哪怕 SHARED_SERVERS 设对了,连接也会被拒绝或静默 fallback 到专用模式。
- 典型配置:
DISPATCHERS='(PROTOCOL=TCP)(SERVICE=ORCLXDB)(DISPATCHERS=2)',其中SERVICE必须匹配数据库的 service_name(不是 instance_name) - 如果监听器跑在非默认端口(比如 1522),
DISPATCHERS里得显式加(PORT=1522),否则 dispatcher 仍监听 1521,客户端连不上 - 不建议硬设
MAX_DISPATCHERS,19c 会自动扩缩容;设了反而可能卡住新 dispatcher 启动 - 检查是否生效:查
V$DISPATCHER,有记录且STATUS是 'READY' 才算活了
客户端连接必须声明 SERVER=SHARED
即使服务端全配好了,客户端不指明要走共享模式,TNS 解析器默认还是给你分专用服务器。
- tnsnames.ora 里每个
DESCRIPTION下的CONNECT_DATA块中加:(SERVER=SHARED) - URL 形式(如 JDBC)必须带
server=shared参数:jdbc:oracle:thin:@//host:1521/ORCL?server=shared - 漏写
SERVER=SHARED的后果:连接成功,但V$SESSION.SERVER显示DEDICATED,白配 - 如果应用混用专用和共享连接,注意
SERVER=DEDICATED和SERVER=SHARED不能共存于同一 service_name,否则监听器路由混乱
UGA 内存容易撑爆共享池
共享服务器把用户会话状态(UGA)放 SGA 里,不是每个会话独占 PGA。一旦 UGA 总量超限,新连接直接报 ORA-04031: unable to allocate ... shared pool。
- 监控关键视图:
V$SGASTAT中查shared pool下session heap和session uga heap占比 - 调大
SHARED_POOL_SIZE是最直接办法;若已启用了LARGE_POOL,可设USE_LARGE_POOL=TRUE让 UGA 走 large pool -
SHARED_SERVER_SESSIONS是软限制,设了能防过载,但不设也不会崩——只是没保护阀值 - 别信“共享服务器一定省内存”:短连接+高并发时它更省;长事务+大结果集时,UGA 累积快,反而更容易 OOM
真正麻烦的不是配参数,而是验证——V$SESSION.SERVER、V$DISPATCHER、V$QUEUE 这三张表得同时对得上,才算落地成功。少看一个,就可能以为通了,其实流量根本没进共享队列。











