当前位置: 首页
数据库
如何配置共享服务器模式_Shared Server连接池参数解析

如何配置共享服务器模式_Shared Server连接池参数解析

热心网友 时间:2026-04-23
转载

Shared Server模式下 DISPATCHERS 参数怎么设才不踩坑

想让Oracle Shared Server连接池稳如磐石,dispatchers这个参数的配置,就是第一道、也是最关键的一道防线。它可不是随便填个数字就能了事的,必须跟实际的并发连接类型、网络延迟情况以及客户端的行为模式深度绑定才行。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

如何配置共享服务器模式_Shared Server连接池参数解析

日常运维中,下面这两种错误现象大家应该不陌生:要么是客户端报错ORA-12520: TNS:listener could not find a vailable handler for requested type of server,要么在数据库里看到大量会话卡在WAITING ON DISPATCHER状态。说到底,这往往就是dispatcher进程没能顶住请求洪峰,或者配置压根没生效导致的。

  • 首先,DISPATCHERS参数必须在init.ora或SPFILE中显式配置。别指望只设置SHARED_SERVERS就能自动拉起dispatcher进程,这是不可能的。
  • 一个比较稳妥的推荐写法是:DISPATCHERS='(PROTOCOL=TCP)(DISPATCHERS=4)(CONNECTIONS=500)(SESSIONS=1000)'。这里需要特别注意,CONNECTIONS指的是单个dispatcher能处理的最大TCP连接数(注意,不是会话数),而SESSIONS才是该dispatcher能服务的总会话上限。
  • 千万别盲目堆数量。每个dispatcher进程大约会占用2–4MB内存;而且在多数OLTP场景下,dispatcher数量一旦超过8个,进程间频繁的上下文切换所带来的开销,反而可能增加整体延迟。
  • 如果业务中使用了SSL加密连接,那就必须单独配置(PROTOCOL=TCPS)的dispatcher。TCP和TCPS协议是不共用同一组进程的,这点务必区分清楚。

SHARED_SERVERS 和 MAX_SHARED_SERVERS 到底谁管扩容

这两个参数的关系,常常让人混淆。简单来说,SHARED_SERVERS是数据库启动时立即创建的共享服务器进程数量,而MAX_SHARED_SERVERS则是它后续能够动态增长到的理论天花板。但是,这个“动态增长”是有严格触发条件的,不是你想扩就能扩。

一个典型的误判是:把MAX_SHARED_SERVERS设得极高(比如200),以为这样就能轻松应对突发流量。结果观察V$SHARED_SERVER视图时却发现,长期只有初始的那几个进程在干活,新进程根本没起来。

  • 触发扩容的核心前提是:当前所有的shared server进程都处于WAITBUSY状态,并且等待队列的长度持续超过了SHARED_SERVER_IDLE_TIME参数设定的时间(默认是60秒)。
  • SHARED_SERVER_IDLE_TIME这个参数也很微妙。设得太小(比如10秒),会导致进程频繁创建和销毁,加剧latch争用;设得太大(比如300秒),又会让系统在突发流量来临时反应迟钝,无法及时扩容。
  • 对于生产环境,一个比较实用的建议是:将初始的SHARED_SERVERS设置为预估峰值并发会话数的15%~25%,MAX_SHARED_SERVERS则设为初始值的1.5倍左右。这样既为弹性伸缩留出了空间,又避免了资源的过度预留。

如何验证 dispatcher 和 shared server 真正在干活

参数配置好了就万事大吉了吗?远远不够。必须进入数据库,查看它们的实时运行状态。很多问题其实不是配错了,而是配置没有按照我们预期的方式运行。

一个常见的错误验证方法是:只查询V$DISPATCHER视图,看到STATUS字段显示‘READY’就以为一切正常。但实际上,这可能意味着所有dispatcher都在空转,而真正的请求压力全都堆积在少数几个shared server进程上。

  • 正确的做法是组合查询几个关键视图:V$DISPATCHER(查看当前dispatcher的数量和状态)、V$SHARED_SERVER(观察每个shared server的BUSYIDLE时间比例)、V$QUEUE(重点关注dispatcher请求队列的长度,特别是WAIT列的值)。
  • 如果V$QUEUE中某个dispatcher对应的WAIT值持续大于5,这就明确发出了信号:该dispatcher已经成为瓶颈,需要增加对应协议的dispatcher数量了。
  • 还可以通过查询SELECT NAME, BUSY/(BUSY+IDLE) AS BUSY_RATE FROM V$SHARED_SERVER;来计算进程的繁忙率。如果该值长期高于0.8,通常意味着shared server数量不足。当然,也要排除是否是某些SQL执行时间过长,拖慢了整个进程池的轮转效率。

Shared Server 下 CLIENT_IDENTIFIER 为什么总为空

这可以说是Shared Server模式下一个最隐蔽的“坑”:应用层精心设置的CLIENT_IDENTIFIER,在连接池复用之后经常莫名其妙地丢失。直接后果就是,基于此的审计日志、性能监控和绑定变量跟踪等功能全部失效。

问题的根源在于:shared server进程是被多个会话复用的,而CLIENT_IDENTIFIER是一个会话(session)级别的属性,并非进程(process)级别。如果应用程序没有在每次发起新的数据库请求时重新设置这个标识符,那么后续的请求就会沿用上一个会话留下的值,甚至直接变成空值。

  • 对于Ja va应用,必须在每次从连接池获取到连接后,立即执行类似conn.prepareStatement("DBMS_SESSION.SET_IDENTIFIER(?)").execute()的语句来设置标识符,绝不能只在连接初始化时设置一次。
  • 使用OCI编写的程序,则需要在调用OCISessionBegin之后,立刻使用OCIAttrSet来设置OCI_ATTR_CLIENT_IDENTIFIER属性。
  • 特别注意:试图在Oracle Wallet或连接字符串里添加CLIENT_IDENTIFIER=xxx无效的。这个技巧仅对专用连接(dedicated connection)生效,在Shared Server模式下会被直接忽略。

这件事的复杂之处在于,它通常不会引发任何报错,业务功能也看似正常。但这恰恰让基于client identifier的所有运维治理能力形同虚设。排查问题时,很容易被误导去检查监听器或网络配置,绕了一大圈,最后才发现根源其实就在应用程序里——每次请求初始化时,少写了那一行关键的设置代码。

来源:https://www.php.cn/faq/2302876.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Oracle Data Guard中如何设置重试策略_解决网络临时波动问题

Oracle Data Guard中如何设置重试策略_解决网络临时波动问题

Oracle Data Guard重试策略:一个常见的理解误区 在讨论Oracle Data Guard的高可用性时,“重试策略”是个高频词。但这里有个关键点需要先厘清:Data Guard本身并不提供一个独立的“重试策略”配置项。你猜怎么着?真正的重试行为,其实是由客户端的连接层——Oracle

时间:2026-04-24 14:52
MongoDB如何更新文档并返回更新后的值_设置returnNewDocument参数

MongoDB如何更新文档并返回更新后的值_设置returnNewDocument参数

MongoDB 中 returnNewDocument 不存在,正确参数是 returnDocument,值为 "before " 或 "after ",仅 findOneAndUpdate() 支持,用于原子性返回更新前 后的完整文档;updateOne() 等纯写操作不返回文档。 先说一个明确的结论

时间:2026-04-24 14:52
SQL如何实现模糊匹配关联_利用Like与Join结合处理非精确匹配

SQL如何实现模糊匹配关联_利用Like与Join结合处理非精确匹配

SQL模糊匹配关联:为什么ON子句里的LIKE %xxx% 是性能陷阱? 直接在 JOIN 的 ON 子句里写 t1 name LIKE CONCAT( % , t2 keyword, % ),这种做法看似直截了当,但十有八九会掉进坑里。问题不在于语法错误,而在于其背后的执行逻辑和数据质量陷阱,

时间:2026-04-24 14:51
Navicat去哪里查看定时自动数据同步历史记录_追踪对比变更日志

Navicat去哪里查看定时自动数据同步历史记录_追踪对比变更日志

Na vicat 自动运行任务有没有执行日志? 答案是肯定的,但它提供的日志,可能和你想象中的“历史记录面板”不太一样。Na vicat 并没有一个集中、可视化的任务执行时间线或变更明细表。它的日志记录方式相对分散,甚至有些被动,主要依赖于两个地方:自动运行任务自身的输出日志,以及 Na vicat

时间:2026-04-24 14:51
SQL怎样在MySQL中实现递归查询_使用WITH RECURSIVE公用表

SQL怎样在MySQL中实现递归查询_使用WITH RECURSIVE公用表

SQL怎样在MySQL中实现递归查询_使用WITH RECURSIVE公用表 MySQL 8 0+ 才支持 WITH RECURSIVE,低版本直接报错 这事儿得先泼盆冷水:如果你手头的MySQL还是5 7或者更老的版本,直接写WITH RECURSIVE语法,铁定会碰一鼻子灰。系统会毫不客气地甩给

时间:2026-04-24 14:51
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程