解决mybatis打印查询结果集造成太多日志的问题
原创 2021-08-24 11:28 阅读(9757)次
我们项目使用的是Mybatis-plus,由于前端要展示所有摄像头,有5000路,页面打开很慢。看了下后端日志,查询时mybatis-plus会把所有5000行数据显示出来,造成后端api请求很慢。SQL日志如下:
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5f45abe6]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5f45abe6] from current transaction
==> 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
==> Parameters: vehiclemodel(String)
<== Columns: dictValue, parentValue, zh-cn, en, ar
<== Row: 1, null, UNKNOW, UNKNOW, null
<== Row: 2, 6, AUDI A3, AUDI A3, null
<== Row: 3, 6, AUDI A4, AUDI A4, null
<== Row: 4, 6, AUDI A5, AUDI A5, null
<== Row: 5, 6, AUDI A6, AUDI A6, null
<== Row: 6, 6, AUDI A7, AUDI A7, null
<== Row: 7, 6, AUDI A8, AUDI A8, null
<== Row: 8, 6, AUDI Q3, AUDI Q3, null
<== Row: 9, 6, AUDI Q5, AUDI Q5, null
<== Row: 10, 6, AUDI Q7, AUDI Q7, null
把mybatis-plus SQL日志关闭后,数据秒出。问题很明显了,我们只要关闭mybatis-plus日志就可以了,由于我们引用的是公司公用的mybatis-plus组件,这个组件默认是开启上面是sql和数据行打印,配置如下:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
我们不能去修改公司的公共组件,我们只能在自己工程上关闭mybatis-plus的日志,配置如下:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl
很快我们发现我们看不到sql语句的日志了,这也不太好,这要是发布到现场,出个什么问题我们不是都无法拿到sql语句来调试了,那有没有什么办法既可以打出sql语句,有参数,又可以不将查询结果集打出来的办法呢?因为查询的结果集太多了,会造成日志太多,磁盘性能下降,且我们并不太关注它。
答案是有的,我们项目使用logback打印日志,mybatis兼容了它,我们可以用如下配置实现:
mybatis-plus.configuration.log-impl=log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
logging:
level:
cn.com.xcx.mapper: debug
这样mybaits的日志就只有sql,参数,数据行数,日志立马少了很多我们不关注的东西,轻松了不少,api飞一般地快了,日志如下:
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
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)
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有如下几种实现,大家可以根据需求自由选择:
JakartaCommonsLoggingImpl
Jdk14LoggingImpl
Log4j2AbastactLoggerImpl
Log4j2Impl
Log4j2LoggerImpl
Log4jImpl
NoLoggingImpl
Slf4jImpl
Slf4jLocationAwareLoggerImpl
Slf4jLoggerImpl
StdOutImpl
mybatis或mybatis-plus在启动时会打出日志,显示当前mybatis的日志适配器:
mybatis-plus init success.
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Using VFS adapter com.baomidou.mybatisplus.spring.boot.starter.SpringBootVFS
下一篇:ES各版本的新特性官网地址