说起这个问题,可把我坑苦了,这个问题一共找了两次,第一次是因为一个sql执行缓慢,我来排查原因,先后排除了sql本身的问题,网络问题,项目代码问题,数据库压力问题,最后问题定位在orm框架生成sql和把查询结果组装成po这一过程中,具体是那个地方一直没有确定,耗时一周,后来因为有其他任务,耗不起时间,就暂时搁置了。
第二次排查这个问题,是因为另一个sql也执行缓慢,同样排除了上文中说的问题,但这次发现一个新的现象,就是sql越长需要的时间也越长,所以问题就划定在orm组装sql这一过程中。
后来经过不懈努力,我终于找到了问题原因。我们使用mybatis-plus框架,其中有一段代码是这样的
private String getTableName(String sql) {Statement statement = null;try {//注意这一行statement = CCJSqlParserUtil.parse(sql);} catch (JSQLParserException e) {e.printStackTrace();}TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();List<String> tableList = tablesNamesFinder.getTableList(statement);if (CollectionUtils.isEmpty(tableList)) {return null;}return tableList.get(0);}
这段代码主要是为了获取sql涉及的数据库表的名字,其中CCJSqlParserUtil.parse(sql)这一句耗时非常严重,在我的场景下需要800ms左右,我的场景是一个sql in查询,in查询本身执行时间20ms左右。
我也没有太多的时间和精力从根本排查解决这个问题,所以选择了一个治标不治本的方法,就是尽量减小sql的长度。效果还不错。
另外这位兄弟跟我的情况差不多,我也记录在这。https://blog.csdn.net/xuanzai666/article/details/134321479