解决mybatis打印查询结果集造成太多日志的问题

原创 2021-08-24 11:28 阅读(9757)次

我们项目使用的是Mybatis-plus,由于前端要展示所有摄像头,有5000路,页面打开很慢。看了下后端日志,查询时mybatis-plus会把所有5000行数据显示出来,造成后端api请求很慢。SQL日志如下:

  1. Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5f45abe6]
  2. Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5f45abe6] from current transaction
  3. ==> Preparing: SELECT a.dict_value "dictValue", a.parent_value "parentValue", string_agg(case when b.type='zh-cn' then b.value end, '') "zh-cn", string_agg(case when b.type='en' then b.value end, '') "en", string_agg(case when b.type='ar' then b.value end, '') "ar" FROM "sys_data_dict" a LEFT JOIN "sys_data_i18n" b ON a.id=b.key WHERE a.dict_type=? and a.enabled = 1 and a.dict_status = 1 GROUP BY a.dict_value,a.parent_value,a.dict_order ORDER BY a.dict_order ASC
  4. ==> Parameters: vehiclemodel(String)
  5. <== Columns: dictValue, parentValue, zh-cn, en, ar
  6. <== Row: 1, null, UNKNOW, UNKNOW, null
  7. <== Row: 2, 6, AUDI A3, AUDI A3, null
  8. <== Row: 3, 6, AUDI A4, AUDI A4, null
  9. <== Row: 4, 6, AUDI A5, AUDI A5, null
  10. <== Row: 5, 6, AUDI A6, AUDI A6, null
  11. <== Row: 6, 6, AUDI A7, AUDI A7, null
  12. <== Row: 7, 6, AUDI A8, AUDI A8, null
  13. <== Row: 8, 6, AUDI Q3, AUDI Q3, null
  14. <== Row: 9, 6, AUDI Q5, AUDI Q5, null
  15. <== Row: 10, 6, AUDI Q7, AUDI Q7, null

把mybatis-plus SQL日志关闭后,数据秒出。问题很明显了,我们只要关闭mybatis-plus日志就可以了,由于我们引用的是公司公用的mybatis-plus组件,这个组件默认是开启上面是sql和数据行打印,配置如下:

  1. mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

我们不能去修改公司的公共组件,我们只能在自己工程上关闭mybatis-plus的日志,配置如下:

  1. mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl

很快我们发现我们看不到sql语句的日志了,这也不太好,这要是发布到现场,出个什么问题我们不是都无法拿到sql语句来调试了,那有没有什么办法既可以打出sql语句,有参数,又可以不将查询结果集打出来的办法呢?因为查询的结果集太多了,会造成日志太多,磁盘性能下降,且我们并不太关注它。

答案是有的,我们项目使用logback打印日志,mybatis兼容了它,我们可以用如下配置实现:

  1. mybatis-plus.configuration.log-impl=log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
  2. logging:
  3. level:
  4. cn.com.xcx.mapper: debug

这样mybaits的日志就只有sql,参数,数据行数,日志立马少了很多我们不关注的东西,轻松了不少,api飞一般地快了,日志如下:

  1. 2021-08-24 11:40:45.614 DEBUG [pip-basic-management] [10.10.0.175:9976] [main] c.c.d.m.d.m.S.getDictItemByDictType : ==> Preparing: SELECT a.dict_value "dictValue", a.parent_value "parentValue", string_agg(case when b.type='zh-cn' then b.value end, '') "zh-cn", string_agg(case when b.type='en' then b.value end, '') "en", string_agg(case when b.type='ar' then b.value end, '') "ar" FROM "sys_data_dict" a LEFT JOIN "sys_data_i18n" b ON a.id=b.key WHERE a.dict_type=? and a.enabled = 1 and a.dict_status = 1 GROUP BY a.dict_value,a.parent_value,a.dict_order ORDER BY a.dict_order ASC
  2. 2021-08-24 11:40:45.615 DEBUG [pip-basic-management] [10.10.0.175:9976] [main] c.c.d.m.d.m.S.getDictItemByDictType : ==> Parameters: vehiclemodel(String)
  3. 2021-08-24 11:40:45.693 DEBUG [pip-basic-management] [10.10.0.175:9976] [main] c.c.d.m.d.m.S.getDictItemByDictType : <== Total: 121

log-impl有如下几种实现,大家可以根据需求自由选择:

  1. JakartaCommonsLoggingImpl
  2. Jdk14LoggingImpl
  3. Log4j2AbastactLoggerImpl
  4. Log4j2Impl
  5. Log4j2LoggerImpl
  6. Log4jImpl
  7. NoLoggingImpl
  8. Slf4jImpl
  9. Slf4jLocationAwareLoggerImpl
  10. Slf4jLoggerImpl
  11. StdOutImpl

mybatis或mybatis-plus在启动时会打出日志,显示当前mybatis的日志适配器:

  1. mybatis-plus init success.
  2. Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
  3. Using VFS adapter com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS