AspectJ用于分析查询执行,使aplicaiont太慢

时间:2013-07-24 14:55:41

标签: aspectj

我正在使用AspecJ来捕获每个表单中正在执行的查询,并显示每个查询执行所需的时间。我们使用的是spring jdbc,我的方面看起来如下:     @方面     公共类QueryProfilerAspect {

@Pointcut("call(* org.springframework.jdbc.core.simple.SimpleJdbcTemplate.query*  (..))")
public void profileQuery() {
}

@Around("profileQuery()")
public Object profile(ProceedingJoinPoint thisJoinPoint) throws Throwable {
    // System.out.println("Inside join point execution");
    SimpleJdbcTemplate template = (SimpleJdbcTemplate) thisJoinPoint
            .getTarget();
    JdbcTemplate jdbcTemplate = (JdbcTemplate) template
            .getNamedParameterJdbcOperations().getJdbcOperations();
    DataSource ds = jdbcTemplate.getDataSource();
    // System.out.println("Datasource name URL =="
    // + ds.getConnection().getMetaData().getURL());
    // System.out.println("Datasource name  ==" + schemaName);

    String sqlQuery = thisJoinPoint.getArgs()[0].toString();
    final long start, end;
    start = System.nanoTime();
    Object ll = thisJoinPoint.proceed();
    end = System.nanoTime();
    long executionTime = ((end - start) / 1000) / 1000;
    System.out.println("execution_time=" +executionTime  + sqlquery="+sqlQuery );
    return ll;

}

功能明智这是有效的,但如果我把它我的应用程序,它使应用程序太慢。我正在使用编译时编织。方面在应用程序中找到1683个查询*方法调用。

我能做些什么来优化这个。任何建议/帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

首先,我建议不要使用System.nanoTime()。使用冷的精确度就像是浪费而且对测量时间跨度几乎没用。如果你仍然将结果分开,肯定不比System.currentTimeMillies()好。

尽管可能会减慢你的速度,但是在你方面的各个地方执行的String操作。如果必须连接字符串,至少在输出之前使用StringBuilder。这可能已由优化器完成,但您永远不会太确定。 ;)

而且......如果你想要记录,那么Sysout就不是那样的了 - 看看各种日志记录实现之一(slf4j带有logback是我个人最喜欢的,但还有其他一些)值得你花时间

特别是如果您想使用Spring具有您正在尝试构建的功能的事实(正如之前所要求和回答的那样:Seeing the underlying SQL in the Spring JdbcTemplate? (编辑:我知道这只是查询,而不是时间测量,但不必担心这应该减少你的开销一段时间。)