系統(tǒng)在初期運行時可能沒問題往毡,每個功能都快速響應,但是隨著數(shù)據(jù)量的增多靶溜,可能個別功能不能快速響應开瞭,但是用戶還不好描述具體哪地方慢,這時候就需要通過AOP來進行性能監(jiān)控罩息,及時發(fā)現(xiàn)系統(tǒng)存在的問題嗤详。
@Aspect
public class PerformanceAspect {
private static Logger logger = LoggerFactory.getLogger("performanceLog");
@Around("execution (* com.critc.*.*.service.*.*(..))")
public Object performanceIterceptor(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
long l = System.currentTimeMillis();
result = joinPoint.proceed();
long consume = System.currentTimeMillis() - l;
if (consume > 3000) {
//記錄系統(tǒng)操作較慢的service處理過程
logger.info("實體類:" + joinPoint.getTarget());
logger.info("方法名:" + joinPoint.getSignature().getName());
// 得到被攔截方法參數(shù),并打印
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
logger.info("方法參數(shù):" + i + " -- " + args[i]);
}
logger.info("用時:" + consume);
}
return result;
}
}
applicationContext.xml
增加配置
<!-- 系統(tǒng)性能監(jiān)控切面-->
<bean id="performanceAspect" class="com.critc.plat.core.aop.PerformanceAspect"/>
這個aop的原理是@Around環(huán)繞型切面瓷炮,開始時記錄當前時間葱色,結束時把結束時間-開始時間,如果超過3000毫秒娘香,則記錄對應的日志苍狰。
這樣就可以監(jiān)控所有service層的操作時間,如果操作時間超過3秒烘绽,記錄下當前類名淋昭、方法名及所有參數(shù),便于追溯問題安接,可以進行后續(xù)的性能調優(yōu)翔忽,比如加索引、優(yōu)化數(shù)據(jù)存儲等等。