`
feipigwang
  • 浏览: 774735 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用动态代理记录方法执行的时间

 
阅读更多

在大型系统中,我们经常需要监视我们系统执行的性能状况,当出现性能问题时,我们要能够迅速地找到瓶颈在什么地方。在程序的层面上来说,就是看哪个方法执行所消耗的时间很长。

使用动态代理可以非常方便的记录方法执行的时间,比如,下面的截图,就是ESBasic.Emit.Aop.Interceptors.MethodTimeInterceptor截获器记录的片段:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2009-4-1718:50:12:TY.Web.AgentInterface.IGameRecordDetailBL.GetPaginationData方法耗时:390ms
2009-4-1718:50:16:TY.Web.MemberInterface.IMemberBL.GetOne方法耗时:106ms
2009-4-1718:50:23:TY.Web.MemberInterface.IMemberBL.GetOne方法耗时:105ms
2009-4-1718:50:23:TY.Web.MemberInterface.IMemberBL.GetOne方法耗时:105ms
2009-4-1718:50:24:TY.Web.AgentInterface.IGameRecordDetailBL.GetPaginationData方法耗时:386ms
2009-4-1718:50:30:TY.Web.AgentInterface.IGameRecordDetailBL.GetPaginationData方法耗时:387ms
2009-4-1718:50:35:TY.Web.AgentInterface.IGameRecordDetailBL.GetPaginationData方法耗时:377ms
2009-4-1718:50:43:TY.Web.MemberInterface.IMemberBL.GetOne方法耗时:105ms
2009-4-1718:51:14:TY.Web.MemberInterface.IGameBenefitBL.GetMemberBenefitData方法耗时:714ms

在我们常见的三层架构中,我们可能需要记录UI层调用BL层的每个方法所执行的时间,那我们可以这样做。假设BL提供给UI访问的接口为IBL(可能有多个,如IBL1,IBL2,IBL3,......),BL通过Remoting的方式发布它的服务。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->//BL层给UI层调用的接口
publicinterfaceIBL
{
}
//BL的实现
publicclassBLObject:IBL
{
}

那么,我们让BL不直接发布实现了IBL接口的对象(BLObject),而是发布拦截了这个对象的动态代理,就像这样:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->IMethodTimeLoggerlogger=newMethodTimeLogger(newFileAgileLogger("TimeLogger.txt"),100);
IBLblObject
=...; //BLObject的实例
IBLblObjectProxy=DynamicProxyFactory.CreateAopProxy<IBL>(blObject,null,newMethodTimeInterceptor(logger));

blObjectProxy即是拦截了blObject调用的动态代理,它和BLObject一样实现了IBL接口,并且将所有的调用转发给blObject,而且记录了blObject每个方法执行的时间。我们可以将blObjectProxy对象发布为Remoting,这样就可以记录下BL每个方法的执行时间了。

在上面的例子中,IMethodTimeLogger接口是用于记录时间的记录器接口,我们可以将时间记录到日志文件,当然也可以记录到数据库或其他地方,你只要实现IMethodTimeLogger接口就可以了。这里我们将时间记录到TimeLogger.txt文件,注意,MethodTimeLogger的第二个参数100,表示只记录那些执行时间超过100ms的方法调用,因为如果要记录所有的方法调用的话,在大型系统中日志可能会在很短的时间内就变得非常的庞大,这样反而不利于日志查看。

再回到上面的日志片段,我们看到,日志记录了BL接口中具体方法的调用时间,执行所消耗的时长,这样我们就可以很方便的找到性能的瓶颈是在那个方法的调用上产生的了。

上述例子中所用到的类都位于ESBasic.dll中,你可以从这里下载进行试验。ESBasic中的动态代理技术是基于Emit实现的,有兴趣的话你可以使用Reflector来查看其实现原理。

关于ESBasic中动态代理实现的更多介绍,可以参考我的这两篇文章:动态代理DynamicProxy 介绍使用动态代理,提高工作效率


分享到:
评论

相关推荐

    springboot中的 动态代理的选择测试代码

    在描述中提到的博客文章"测试springboot使用动态代理时候的一些代码"中,作者可能展示了如何配置Spring Boot的AOP,以及如何编写切面(Aspect)来定义通知(Advice),比如前置通知、后置通知、环绕通知等。...

    JDK动态代理源码

    - `TimeHandler.java`:这是一个实现了`InvocationHandler`接口的类,通常在这里处理具体的业务逻辑,例如记录方法的执行时间。 - `Test.java`:测试类,通过`Proxy.newProxyInstance()`创建代理对象,并进行方法...

    一篇讲动态代理的好文 <动态代理的前世今生>

    3. **性能监控**:自动统计方法执行时间,帮助分析系统性能瓶颈。 4. **权限验证**:在调用敏感方法前进行权限验证,提高系统安全性。 5. **缓存管理**:自动缓存方法返回结果,减少数据库查询次数,提高响应速度。 ...

    动态代理原理实例Demo

    Java动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以代替原对象执行某些额外...通过理解和熟练使用动态代理,我们可以更高效地实现AOP功能,提升代码的可维护性和复用性。

    spring动态代理

    - **性能监控**:记录方法执行时间,分析系统性能瓶颈。 - **安全控制**:在调用方法前进行权限验证。 - **日志记录**:记录方法的调用情况,便于追踪问题。 理解 Spring 动态代理的原理和使用方式,对于开发者...

    spring boot aop 记录方法执行时间代码示例

    Spring Boot AOP 记录方法执行时间代码示例 本文主要介绍了使用 Spring ...本文提供了一个基于 Spring Boot AOP 的方法执行时间记录代码示例,展示了如何使用 AOP 来记录方法的执行时间,以便对系统的性能进行调优。

    java 简答可复用动态代理类

    - 性能监控:统计方法的执行时间,优化性能。 - 安全控制:在方法调用前进行权限检查。 - AOP(面向切面编程):实现事务管理、缓存策略等跨切面关注点。 总的来说,Java动态代理是一项强大的工具,它能够让我们...

    动态代理(AOP)简单例子

    - 性能监控:计算方法的执行时间,用于性能分析。 - 安全控制:在方法调用前进行权限检查。 - 事务管理:在一组方法调用中自动管理事务的开始、提交或回滚。 6. **Spring AOP**: - Spring提供了自己的AOP框架...

    四、Spring源码分析——动态代理

    - 性能监控:统计方法的执行时间,优化性能瓶颈。 - 权限控制:在调用方法前进行权限验证。 通过上述分析,我们可以看到Spring动态代理是如何在运行时创建代理对象并实现代理功能的。了解这一机制对于深入理解和...

    动态代理设计模式详解.pdf

    然后,通过Proxy.newProxyInstance()方法,我们可以为任何实现了特定接口的对象创建动态代理,这样TimeProxy就能代理任何对象的任何方法,并执行时间计算。 动态代理的优势在于其灵活性和可扩展性。它可以适应接口...

    AOP动态代理(反射机制)

    2. **InvocationHandler接口**:这个接口定义了一个invoke()方法,当代理对象的方法被调用时,实际执行的是这个方法。invoke()方法接收三个参数:代理对象、被调用的方法(Method类型)以及方法调用时的参数数组。...

    C# 面向切面编程--监控日志记录方案

    对于所有需要进行日志记录的方法的采用对该方法所在的类进行...因为方法内部的日志一般都要统计时间长度,动态代理Stopwatch的Start方法和Stop方法,在Start和Stop调用的时后记录出方法的执行时间和中间参变量的值。

    java 动态代理 完整版

    - **性能监控**:自动记录方法执行的时间等信息。 - **事务管理**:自动开启和提交事务。 - **权限控制**:在方法调用前检查用户权限。 - **缓存**:缓存方法调用的结果,提高性能。 #### 七、案例分析 假设我们...

    Spring动态代理

    在Spring MVC中,我们可以使用Spring的AOP支持来创建拦截器(Interceptor),这些拦截器可以在方法执行前和执行后执行自定义逻辑,如记录日志。在RESTful服务中,这种功能尤其有用,因为它可以帮助我们了解API的调用...

    用Java实现的代理模式之动态代理

    - 性能监控:统计方法的执行时间,用于性能分析。 - 认证与授权:在调用方法前进行用户身份验证和权限检查。 - 缓存:如果某个方法的计算代价高昂,可以先检查缓存,避免重复计算。 - 异常处理:统一异常处理,...

    动态代理设计模式-源码

    // 提交事务、记录执行时间等 } } // 创建代理对象 MyService proxyService = (MyService) Proxy.newProxyInstance( MyService.class.getClassLoader(), new Class[]{MyService.class}, new ...

    spring动态代理解析

    2. **性能监控**:通过动态代理可以方便地对方法执行时间进行监控。 3. **事务管理**:在不改变业务逻辑的前提下,使用动态代理处理事务的开启和提交/回滚等操作。 4. **权限控制**:通过动态代理实现在方法调用前...

    动态代理实现AOP思想

    在编程领域,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,以此来拦截方法调用并执行额外的逻辑。动态代理在许多场景下都有应用,特别是在实现面向切面编程(Aspect-Oriented Programming,简称AOP...

    java动态代理1

    `MonitorUtil` 工具类用于计算方法的执行时间,它使用 `ThreadLocal` 存储开始时间,并在方法执行前后调用 `start` 和 `finish` 方法来计算耗时。在 `invoke` 方法中,我们可以在调用原始方法之前调用 `MonitorUtil....

Global site tag (gtag.js) - Google Analytics