Oracle数据库连接模式分为专用模式和共享模式:专用模式中用户进程与服务进程一一对应,会话信息存于PGA;共享模式通过调度器和共享服务器进程复用处理请求,UGA存于SGA,支持高并发。
oracle监听器本身不执行存储过程,它只负责把连接请求转给数据库实例;真正影响大并发下存储过程响应的,是监听队列长度、服务注册方式、以及后端连接模式(专用 vs 共享),不是监听器“功能增强”。
为什么改 listener.ora 的 QUEUESIZE 是第一要务
默认 QUEUESIZE 通常为 128 或 256,高并发瞬间大量连接涌进来时,监听器来不及派生进程或调度,直接丢弃新连接,报错 TNS-12518: TNS:listener could not hand off client connection。
- 必须在
listener.ora对应监听器的ADDRESS段里显式加QUEUESIZE=1024(金融/电商类系统建议 ≥2048) - 修改后不能只
lsnrctl stop/start,必须用lsnrctl reload才生效 -
QUEUESIZE是操作系统级 socket listen() 调用的 backlog 参数,设太高可能被内核截断(Linux 默认 net.core.somaxconn=128,需同步调大)
动态注册失败会导致连接成功但存储过程卡住
客户端连进去了,SQL 可以跑,但一调存储过程就超时或 hang 住——常见原因是数据库没向监听器完整注册服务,尤其是 SERVICE_NAME 对应的服务没带 DEDICATED 或 SHARED 属性,导致监听器无法正确派生服务器进程。
- 查当前注册状态:
lsnrctl status看 Services Summary 下该服务是否显示DEDICATED SERVER(专用模式)或SHARED SERVER - 若缺失,确认数据库中
service_names和local_listener设置匹配:SELECT value FROM v$parameter WHERE name IN ('service_names', 'local_listener'); - 强制刷新注册:
ALTER SYSTEM REGISTER;(不是 restart 实例,也不是 reload listener)
共享服务器模式(Shared Server)才是大并发存储过程的解法
专用服务器(Dedicated Server)下每个连接独占一个 OS 进程,1000 并发 ≈ 1000 个进程,内存和上下文切换开销爆炸;而共享服务器复用一组公共的 SMON/PMON 和调度器进程,更适合短时高频的存储过程调用。
- 启用前先检查:数据库必须开启
shared_servers参数(如ALTER SYSTEM SET shared_servers = 20 SCOPE=BOTH;) - 监听器配置里必须包含
(SERVER=SHARED)在tnsnames.ora别名的CONNECT_DATA段,否则客户端仍走专用模式 - 注意:部分存储过程依赖 UTL_* 包或外部过程(EXTPROC),共享模式下受限,需提前验证
真正卡住大并发存储过程的,往往不是监听器配得不够“花哨”,而是没关掉静态注册、没调 QUEUESIZE、没让 PMON 动态注册完整服务、或者根本没切到共享模式——这些点漏掉任意一个,加再多监听器也没用。


















