ODP.NET连接池性能计数器
作者:范俊 2013-05-25
阅读本文需要了解两个知识:
1、 Oracle Data Provider for .NET(ODP.NET) ——ORACLE公司为.NET开发者提供的,使用.NET访问ORACLE 数据库的类库。
2、 性能计数器(PerformanceCounter)—— <引用百度百科>也叫性能监视器,是WindowsNT/2000提供的一种系统功能。它能实时采集、分析系统内的应用程序、服务、驱动程序等的性能数据,以此来分析系统的瓶颈、监视组件的表现,最终帮助用户进行系统的合理调配。
前段时间查问题,偶然看到Oracle客户端的版本升级说明,发现从 11.1.0.6.20 版开始支持了连接池性能计数器。这可是个好东西,可以监控使用ODP.NET方式时数据库连接池的情况!对我们分析数据库的访问性能和追查具体问题都很有帮助!所以特别试了一下,并把使用中遇到的关键问题做了整理和记录。
关键点一:注册性能计数器
在Windows操作系统中,通过Oracle客户端(版本需要是11.1.0.6.20或更高)安装了Oracle Data Provider for .NET (ODP.NET)组件,应该就能在性能计数器中找到相关计数器。但我部署过不少环境,但都不记得发现过有ODP.NET的性能计数器。经过查询资料发现,可以手工到OracleHome路径下执行ODP.NET\bin\2.x\OraProvCfg.exe进行注册,注册命令为“/action:register/product:odp /component:perfcounter /providerpath:”。示例:
OraProvCfg /action:register /product:odp /component:perfcounter /providerpath:D:\app\Administrator\product\11.2.0\dbhome_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll |
注册后,就可在管理器中找到分类“Oracle Data Provider for .NET”,该分类下就是相应的连接池计数器了。但使用前还有另一个要点,就是需要启用具体的性能计数器!
关键点二:启用具体的性能计数器
ODP.NET这几个计数器即使在注册后也是缺省不生效的,查阅官方文档后得知需要单独设置。有两种方式控制具体计数器的启用状态:
【方式一:注册表】
通过设置注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Version 中 的值来控制每个独立计数器的启用状态。
【方式二:应用程序配置文件(app.config)】
在配置中加入“oracle.dataaccess.client”节点,并指定 PerformanceCounters 项的值。
<configuration> <oracle.dataaccess.client> <settings> <add name="PerformanceCounters" value="3"/> </settings> </oracle.dataaccess.client> </configuration> |
ODP.NET 会优先采用应用程序配置文件app.config中的设置。所以在程序运行时,具体开启哪些计数器是根据配置文件app.config为准,如果没有设置才以数据库中的设置为准。具体PerformanceCounters 值的含义如下表:
性能计数器 | 键值 | 描述 |
HardConnectsPerSecond | 1 | 每秒建立的与 Oracle 数据库服务器的会话数 |
HardDisconnectsPerSecond | 2 | 每秒提供的与 Oracle 数据库服务器的会话数 |
SoftConnectsPerSecond | 4 | 每秒从连接池生成的活动连接数 |
SoftDisconnectsPerSecond | 8 | 每秒返回到连接池的活动连接数 |
NumberOfActiveConnectionPools | 16 | 活动连接池总数 |
NumberOfInactiveConnectionPools | 32 | 即将处理的不活动连接池数 |
NumberOfActiveConnections | 64 | 正在使用的连接总数 |
NumberOfFreeConnections | 128 | 所有连接池中可用连接总数 |
NumberOfPooledConnections | 256 | 池式活动连接数 |
NumberOfNonPooledConnections | 512 | 非池式活动连接数 |
NumberOfReclaimedConnections | 1024 | 作为垃圾隐式收集的连接数 |
NumberOfStasisConnections | 2048 | 池中即将可用的连接数。用户已关闭这些连接, 当前正在等待特定操作 (如事务处理) 完成, 完成之后才能将这些连接作为空闲连接重新放回池中。 |
在注册ODP.NET提供的连接池计数器时,注册表中 PerformanceCounters 的值缺省为0,表示不启用任何计数器。
想开启多个计数器,将相应键值做与运算即可。因为键值都是2的n次方,所以直接相加就得到我们想要的最终键值。所以想开启所有的计数器,则将值设置为4095即可。
到这里,通过Window控制台方式使用性能计数器应该就没什么问题了,都是界面化的操作,和使用其他性能计数器应该没什么差别了。
但是,要通过编程方式创建对应计数器的话还有一点需要注意,那就是计数器的实例名规则。
关键点三:计数器的实例名
提供的这些性能计数器都是需要指定实例的(不同的进程有不同实例名称)。通过编程方式创建对应计数器的话,需要明确传入实例名称,所以需要在代码中生成该名称。用的时候发现ODP.NET的这几个计数器,实例名称的规则和其他微软提供的不太一样,要复杂些。
通常计数器实例名都是AppDomain的名称,而这几个的名称规则是“AppDomain名称 [进程ID,AppDomain的ID]”(如“odptest.exe [7784,1]”)。
基本的使用就是这些了,希望对第一次使用它的人有个指导。最后还是想感叹下,大概是因为这是Oracle对MS的功能做支持,使用起来没MS自己的东西顺手,设置上感觉拐了几道弯。不过还是要感谢Oracle做的支持,为我们使用ODP.NET提供了性能分析上的支撑!
文章原始链接:http://blog.csdn.net/debug_fan/article/details/8973467
注意:转载请保留文章完整,并注明出处!谢谢!