主要观点总结
文章主要讨论了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
………………………………