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计数器。
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