快速业务通道

AOP@Work: 用AspectJ进行性能监视,第1部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
据库名称的连接的 连接图。随后在执行 JDBC 语句更新对应请求的统计值时,会使用这个图。 JdbcConnectionMonitor 还提供了一个辅助方法 getDatabaseName(),它从连接 图中查询字符串名称找到连接。

弱标识图和方面

JDBC 监视方面使用 弱标识 哈希图。这些图持有 弱 引用,允许连接这样的 被跟踪对象在只有方面引用它们的时候,被垃圾收集掉。这一点很重要,因为单 体的方面通常 不会 被垃圾收集。如果引用不弱,那么应用程序会有内存泄漏。 方面用 标识 图来避免调用连接或语句的hashCode 或 equals 方法。这很重要 , 因为我想跟踪连接和语句,而不理会它们的状态:我不想遇到来自 hashCode 方 法的异常,也不想在对象的内部状态已经改变时(例如关闭时),指望对象的哈 希码保持不变。我在处理动态的基于代理的 JDBC 对象(就像来自 iBatis 的那 些对象)时遇到了这个问题:在连接已经关闭之后调用对象上的方法就会抛出异 常。在完成操作之后还想记录统计值时会造成错误。

从这里可以学到的教训是:把对第三方代码的假设最小化。使用标识图是避 免 对接受建议的代码的实现逻辑进行猜测的好方法。在这种情况下,我使用了来自 DCL Java 工具的 WeakIdentityHashMap 开放源码实现(请参阅 参考资料)。 跟 踪连接或语句的元数据信息让我可以跨越请求,针对连接或语句把统计值分组。 这意味着可以只根据对象实例进行跟踪,而不需要使用对象等价性来跟踪这些 JDBC 对象。另一个要记住的教训是:不同的对象经常用不同的修饰器包装(越 来 越多地采用动态代理) JDBC 对象。所以假设要处理的是这类接口的简单而原始 的实现,可不是一个好主意!

jdbcStatementMonitor 内部

清单 7 显示了 JdbcStatementMonitor 方面。这个方面有两个主要职责:跟 踪与创建和准备语句有关的信息,然后监视 JDBC 语句执行的性能统计值。

清单 7. JdbcStatementMonitor 方面

/** * Monitor performance for executing JDBC statements, * and track the connections used to create them, * and the SQL used to prepare them (if appropriate). */ public aspect JdbcStatementMonitor extends AbstractRequestMonitor {    /** Matches any execution of a JDBC statement */   public pointcut statementExec(Statement statement) :     call(* java.sql..*.execute*(..)) &&      target (statement);   /**    * Store the sanitized SQL for dynamic statements.    */   before(Statement statement, String sql,    RequestContext parentContext):     statementExec(statement) && args(sql, ..)      && inRequest(parentContext) {     sql = stripAfterWhere(sql);      setUpStatement(statement, sql, parentContext);   }    /** Monitor performance for executing a JDBC statement. */   Object around(final Statement statement) :    statementExec (statement) {     RequestContext requestContext =       new StatementRequestContext() {       public Object doExecute () {         return proceed(statement);       }     };     return requestContext.execute();   }   /**    * Call to create a Statement.    * @param connection the connection called to    * create the statement, which is bound to    * track the statement''s origin    */   public pointcut callCreateStatement(Connection connection):       call(Statement+ Connection.*(..))      

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号