My Life My Dream!

守信 求实 好学 力行
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

关于ODP.NET连接数监控及相应的windbg分析提示

Posted on 2017-02-23 15:16  召冠  阅读(824)  评论(0编辑  收藏  举报

1、关于ODP.NET的Windows计数器问题

       使用微软的缺省驱动时,可以通过windows性能监视器很方便的监控数据库连接数,选择.NET Data Provider for Oracle/Sqlserver中的NumberOfPooledConnections即可。但是微软早就放弃了对Oracle驱动的更新,该驱动不仅在性能上比较差(读取40000 rows * 30 cols的数据,仅数据转换大约耗时25秒,而ODP.NET仅需5秒),更悲催的是System.Data.OracleClient还有不少bug….本人就在一个项目上遇到数据行翻倍的事情,更新使用ODP.NET后原来的计数器自然就不能使用了,安装Oracle客户端时选择ODP.NET组件后,Windows计数器中会出现Oracle Data Provider for .NET的选项,但选择对应的子项和实例后却看不到任何信息,原来缺省是没有启用的。可以通过修改注册表启用计数器:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Version,找到PerformanceCounters,将该值改为4095即可,然后重启IIS或回收应用程序池。

参考资料: http://blog.csdn.net/debug_fan/article/details/8973467

另外,根据dump分析看,监视器中显示的NumberOfPooledConnections仅包含正在使用的连接,如果要看所有打开的连接应该在加上NumberOfFreeConnections计数器。

image

image

 

2、关于ODP.NET在dump分析的查找

使用windbg分析dump时,遇到ODP.NET在实现ADO.NET接口的内部实现特立独行的问题,按照微软缺省的方式找了半天,在此记录备忘。

Command ---> m_connection [OracleConnection] ---> 1) m_conString [String] ; 2) m_opoConCtx [OpoConCtx] ---> pool [ConnectionPool] ---> m_connections [Collections.Stack]  ---> _s [Collections.Stack]  ---> _array (System.Object[])

也可以通过 命令直接查找连接或连接池: 

!dumpheap -type Oracle.DataAccess.Client.ConnectionPool

!dumpheap -type Oracle.DataAccess.Client.OracleConnection

 

另外,还有全托管驱动的问题Oracle.ManagedDataAccess.Client,该实现的命令及路径跟ODP.NET又有很大不同。

Oracle.ManagedDataAccess.Client.OracleConnection

具体实现是下面两个

OracleInternal.ServiceObjects.OracleConnectionImpl

OracleInternal.ConnectionPool.OraclePoolManager

连接字符串也很特别,是在两处分开存储的: OracleConnection的ConnectionString  --->m_constring \ m_compString \ m_passwordlessConString 和OracleConnectionImpl 的 m_password

image

image

image