专栏名称: Java知音
专注于Java,推送技术文章,热门开源项目等。致力打造一个有实用,有情怀的Java技术公众号!
目录
今天看啥  ›  专栏  ›  Java知音

大厂禁用!MyBatis标准日志输出有重大缺陷?手把手教你定制高性能日志方案!

Java知音  · 公众号  ·  · 2025-04-24 10:05
    

主要观点总结

文章主要讨论了MyBatis及其衍生产品日志输出的问题,指出使用System.out.println()作为日志输出方式带来的问题,包括阻塞线程、导致SQL查询延迟、并发性能问题等,并介绍了如何通过更换日志输出实现、自定义Log实现以及日志配置来优化。

关键观点总结

关键观点1: MyBatis日志输出问题

MyBatis默认使用StdOutImpl类通过System.out.println()输出日志,这种方式会导致线程阻塞和并发性能问题。

关键观点2: System.out.println()的问题

System.out.println()会阻塞当前线程,且在多线程环境中会因为对同一个System.out加锁使用,导致严重的并发性能问题。

关键观点3: 优化方案

可以通过更换日志输出实现,如使用Slf4jImpl,解决日志输出的性能问题,并通过Log库配置统一SQL日志的格式和输出位置。

关键观点4: 自定义Log实现

可以实现自己的Log,将输出改为info级别,以调整日志输出内容和级别。

关键观点5: 日志配置

在Log配置中,可以指定日志输出级别和屏蔽某些无用的日志。


文章预览

我们在使用MyBatis或衍生产品时,通常会打开其默认日志输出功能,通过SQL日志来排查问题。但你是否注意过为什么MyBatis日志总是与其它Log格格不入,没有日期、级别等等,全部靠左侧输出? 在指定默认日志输出时,经常使用一个名为 StdOutImpl 的类: public   class   StdOutImpl   implements   Log   {  ...      public   void   debug (String s)   {         System.out.println(s);     }      public   void   trace (String s)   {         System.out.println(s);     }     ... } 默认使用 System.out.println() 输出日志,众所周知,其输出时会阻塞当前线程,导致SQL查询不得不等待日志输出完后才能返回结果。 这也是大多数文章推荐使用Log而不是 System.out.println() 的原因,因为Log是异步的。 但并发量不大的时候,可能感知不到 System.out.println() 带来的负面影响。 更糟糕的情况 接口响应缓慢、C ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览