一、前提:
在原有的项目中做迭代,发现一个sql执行效率特别慢,总费事16秒时间,触发了生产环境的报警机制。根据获取日志拿到mybatis的动态sql,在本地创建库表,执行效率不到1秒,执行效率并不慢;所以想着是否时sprinAop机制没有写好,导致执行的时候费时间。
排查了aop机制的代码,发现并不是这个问题,而是在记录打印log日志时,生成的log日志慢,因为前面开发人员是从度娘上找的(从网上可以找到),代码没有任何问题,但是当sql长度超过一定时,会存在用时过长问题,这是开发人员没有考虑到的,这里我将该处做了一些优化。
二、问题排查:
2.1、getSql 获取动态sql:
public static String getSql(Invocation invocation) {
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Object parameter = "";
if (invocation.getArgs().length > 1) {
parameter = invocation.getArgs()[1];
}
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
Configuration configuration = mappedStatement.getConfiguration();
Object parameterObject = boundSql.getParameterObject();
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
if (parameterMappings.size() > 0 && parameterObject != null) {
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject)));
} else {
MetaObject metaObject = c