我正在使用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个查询*方法调用。
我能做些什么来优化这个。任何建议/帮助将非常感激。
答案 0 :(得分:0)
首先,我建议不要使用System.nanoTime()。使用冷的精确度就像是浪费而且对测量时间跨度几乎没用。如果你仍然将结果分开,肯定不比System.currentTimeMillies()好。
尽管可能会减慢你的速度,但是在你方面的各个地方执行的String操作。如果必须连接字符串,至少在输出之前使用StringBuilder。这可能已由优化器完成,但您永远不会太确定。 ;)
而且......如果你想要记录,那么Sysout就不是那样的了 - 看看各种日志记录实现之一(slf4j带有logback是我个人最喜欢的,但还有其他一些)值得你花时间
特别是如果您想使用Spring具有您正在尝试构建的功能的事实(正如之前所要求和回答的那样:Seeing the underlying SQL in the Spring JdbcTemplate? (编辑:我知道这只是查询,而不是时间测量,但不必担心这应该减少你的开销一段时间。)