You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 2019服务器IIS回收后Oracle数据库连接激增问题排查

定位IIS回收后Oracle连接数翻倍的问题及监控方案

一、定位连接创建来源

1. 从Oracle数据库端排查连接详情

通过查询Oracle系统视图,直接获取连接的发起方信息:

SELECT 
  s.sid, s.serial#, s.username, 
  s.program, s.module, s.action, 
  p.spid, s.machine, s.logon_time
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.username = '你的应用数据库用户名';
  • program字段会显示发起连接的进程名,IIS工作进程通常是w3wp.exe,可确认是否为目标VB.NET应用产生的连接;
  • machine字段对应Web服务器的主机名,排除其他机器的连接干扰;
  • logon_time可对应IIS回收的时间点,确认连接是回收后新创建的;
  • module和action字段会携带ODP.NET传递的应用上下文(如程序集名称、代码方法名),能定位到具体的代码模块。

2. 检查ODP.NET连接池配置

查看应用的web.config中的数据库连接字符串,重点关注连接池相关参数:

<connectionStrings>
  <add name="OracleConn" connectionString="Data Source=ORCL;User Id=APP_USER;Password=XXX;Min Pool Size=5;Max Pool Size=50;Connection Lifetime=1800;" />
</connectionStrings>
  • 如果Min Pool Size设置过高,IIS回收后新启动的工作进程会直接创建该数量的连接,若旧进程的连接未被及时回收(即使配置了expire_time,可能存在延迟),就会出现连接数翻倍;
  • Connection Lifetime参数控制连接的最大存活时间,到期后连接会被销毁,可调整该值加速旧连接回收。

3. 排查应用初始化逻辑

检查VB.NET应用的启动代码(如Global.asax的Application_Start方法、静态类构造函数),确认是否存在以下情况:

  • 预加载数据时批量创建数据库连接,但未正确释放;
  • 使用静态连接对象,未实现自动释放逻辑,导致IIS回收后新进程重复创建;
  • 第三方组件或框架在启动时自动初始化大量连接池连接。

二、可用的监控工具

1. Oracle端监控工具

  • 系统视图实时查询:定时执行v$session、v$process、v$session_wait视图查询,记录连接数变化和连接状态;
  • Oracle Enterprise Manager (OEM):通过OEM的性能面板监控连接数趋势,设置连接数阈值告警,关联IIS回收时间点分析;
  • AWR报告:生成IIS回收前后的AWR报告,查看连接数变化、空闲连接占比及相关性能指标。

2. Windows/IIS端监控工具

  • Performance Monitor (perfmon):添加以下计数器跟踪:
    • .NET Data Provider for Oracle -> NumberOfActiveConnections、NumberOfPooledConnections:实时查看连接池的连接数量变化;
    • IIS Worker Processes -> Active Requests、Process ID:跟踪IIS回收前后的工作进程数量;
    • Process -> w3wp.exe -> Handle Count、Thread Count:关联数据库连接数变化,确认进程资源占用情况。
  • IIS日志:启用IIS的详细日志,检查回收后是否有异常请求触发连接创建(即使无用户操作,可能存在定时任务、健康检查请求)。

3. 代码级与网络监控

  • Visual Studio诊断工具:将调试器附加到IIS工作进程,在IIS回收后跟踪连接创建的调用栈,定位具体代码位置;
  • 自定义日志:在VB.NET代码中添加连接创建/释放的日志(如用Trace或日志框架),记录调用方法、时间和连接ID,对应IIS回收时间点分析;
  • Wireshark:抓取Web服务器与Oracle数据库之间的TCP数据包,确认IIS回收后是否有大量TCP连接建立请求,验证连接发起方。

补充排查点

  • 确认sqlnet.ora的expire_time参数是否生效:查询v$session的last_call_et字段,查看空闲连接的持续时间是否超过设置的阈值;
  • 检查数据库配置文件中的IDLE_TIME参数,确认是否开启了空闲连接自动断开,且RESOURCE_LIMIT参数已设置为TRUE。

内容的提问来源于stack exchange,提问作者Nate Himmons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:47:47