ODP.NET性能计数器需通过OraProvCfg.exe以管理员身份显式注册,仅支持.NET Framework的Oracle.DataAccess.dll,注册后须重启目标进程;关键指标分软连接(池内)和硬连接(DB真实会话)两类,其数值归零通常因AppDomain卸载而非连接关闭。
ODP.NET 性能计数器在哪启用
odp.net 的性能计数器默认是关闭的,不手动配置就完全看不到数据。关键在于 oraprovcfg.exe 工具 —— 它不是安装完就自动注册计数器的,必须显式执行注册命令。
常见错误现象:在 Windows Performance Monitor 里搜不到 Oracle Data Provider for .NET 相关计数器,或者只看到空实例、数值全为 0。
- 确保以管理员身份运行命令提示符(否则注册会静默失败)
- 路径要对:Oracle 12c/19c 通常在
%ORACLE_HOME%\odp.net\bin\4\OraProvCfg.exe;.NET Core 版本不支持计数器,仅限 .NET Framework - 执行:
OraProvCfg.exe /action:config /product:odp /version:<your_version> /providerpath:<full_path_to_oracle.dataaccess.dll></full_path_to_oracle.dataaccess.dll></your_version>,其中<your_version></your_version>如4.122.19.1,必须和 DLL 文件版本严格一致 - 注册后需重启目标进程(如 IIS 应用池、Windows 服务),计数器才开始采集
Performance Monitor 里该看哪些关键计数器
ODP.NET 暴露的计数器分两类:软连接(connection pooling)相关和硬连接(actual network sessions)相关。混淆这两者是分析误判的主因。
使用场景:排查连接泄漏、池耗尽、数据库侧连接风暴时,必须交叉比对两组指标。
- 软连接类(反映池行为):
Number of Active Connections、Number of Free Connections、Number of Pooling Connections - 硬连接类(反映真实 DB 连接):
Number of Active Sessions、Number of Open Sessions(注意:这个值 ≈ 数据库v$session中对应客户端的记录数) - 如果
Number of Active Connections长期接近Max Pool Size,但Number of Active Sessions很低 → 池没释放,大概率是Connection.Close()被跳过或异常吞掉 - 如果两者同步飙升且居高不下 → 真实连接数压垮 DB,得查应用是否未复用连接、或
Min Pool Size设得过高
为什么计数器数值“不动”或“突变归零”
这不是监控工具问题,而是 ODP.NET 计数器本身的生命周期机制导致的 —— 它们绑定到 AppDomain,不是全局 Windows 服务级指标。
性能 / 兼容性影响:IIS 应用池回收、AppDomain.Unload()、甚至某些热更新框架(如旧版 ASP.NET WebForms 的页面重编译)都会让整个计数器实例销毁,再新建时从 0 开始累加。
- 不要依赖单次长时间趋势图做容量评估;应关注“回收后稳定期”的均值与峰谷差
-
Number of Open Sessions归零 ≠ 连接真的关了,可能只是 AppDomain 卸载导致计数器重置,而数据库侧连接仍存活(直到超时) - 若用 Windows Service 托管,确保它不随配置变更自动重启,否则同样丢失历史上下文
.NET Framework 版本与计数器可用性差异
不是所有 ODP.NET 版本都提供完整计数器集。尤其从 Oracle 12.1 开始,部分旧计数器被标记为 deprecated,新版本(如 19c 的 Oracle.ManagedDataAccess)干脆彻底移除 —— 它压根不注册任何 Performance Counter。
参数差异:你看到的计数器名称、实例名格式(比如是否带 Default 后缀)、甚至是否包含 Hard/Soft 前缀,都取决于 Oracle.DataAccess.dll 的具体构建版本。
- 确认 DLL 类型:
Oracle.DataAccess.dll(非托管驱动)支持计数器;Oracle.ManagedDataAccess.dll(纯托管)不支持 - 检查 GAC 中实际加载的是哪个版本:
gacutil -l Oracle.DataAccess,避免开发机有多个版本混用 - 错误信息
Category does not exist往往是因为注册时用了 x64 工具配 x86 进程(或反之),务必匹配目标进程位数
计数器本身不加密、不采样、不聚合,是直连 Oracle 客户端内部状态的快照。一旦启动,开销极小;但它的脆弱性在于生命周期绑定太紧——AppDomain 一卸载,所有上下文就没了。这点比 SQL Server 的 SQLServer:General Statistics 类计数器难盯得多。










