使用AspectJ监视数据库访问方法

时间:2014-08-14 03:40:31

标签: java sql monitoring aop aspectj

我想使用AspectJ来监控数据库语句。

当我将切入点定义为

@Pointcut("execution(* java.sql.*Statement.execute*(..))")

它不起作用。但是当我将切入点定义为

@Pointcut("execution(* *.*(..))")

它可以监控所有方法。

如何定义切入点以仅监控数据库访问方法?

1 个答案:

答案 0 :(得分:7)

你说的不是真的,因为使用第二个切入点你可以捕获大量的方法执行但JDK内部没有任何内容。如果你想了一会儿就明白了原因:AspectJ设备字节代码,但只有你自己的类或库的字节代码,而不是JDK字节代码,因为你没有将你的方面编织到JDK中。因此,您无法捕获JDK中的任何execution()个连接点(除非您在rt.jar左右设置类文件)。

现在你如何解决问题?首先,您需要了解execution()call()切入点之间的根本区别:前者编织成 callees ,即直接进入目标方法。后者编入 调用者 ,即编入目标方法的所有地方。

所以你想尝试

@Pointcut("call(* java.sql.*Statement.execute*(..))")

但有一点需要注意:如果您自己的代码(即使用AspectJ编译的代码)直接调用语句,那么您就可以了。如果你有兴趣捕获第三方库的调用,你或者需要编织那些通过二进制编织(生成一个新的库,编织类文件替换原始文件)或者通过加载时编织(检测字节)在运行时加载代码)。两者都是可能的。但是如何做到这一点超出了本文的范围,请阅读AspectJ文档以获取相关说明。最后但并非最不重要的是,如果JDK代码在内部调用这些方法,那么除了编织JDK(rt.jar或SQL代码所在的任何地方)之外,您将无法通过任何其他方式捕获调用,如上所述。 / p>

我知道这是一个简单问题的复杂答案,但在使用它之前你真的需要理解AspectJ,否则你可能无法完全理解我试图解释的内容。 AspectJ很有趣,可以学习和试验,花时间享受它。如果您只是复制并粘贴代码片段,那么您只需使用(非常强大的)工具即可。 :-)