某日,在测试环境观察中发现,即使是一个很简单的sql语句执行都会导致执行时间达到500ms以上,而sql在数据库执行只需要20ms左右。
为了解决这个问题,我首先使用jstack 将日志所有堆栈打印出现观察,在日志中观察发现,大量的线程阻塞在Class.forName()
从堆栈可以看到,是阻塞在了Class.forName,再根据最深的堆栈可以观察到,在硬盘检索文件。通过查看对应的源码文件发现,这是一个公司级组件,通过try catch Class.forName的方式兼容某个框架的不同版本。而我当前使用的版本Class.forName是找不到的,导致每次Class.forName都会在硬盘检索一次文件,导致每次sql执行检索一次硬盘文件浪费了500ms。
最终通过调整机制,仅在启动的时候Class.forname判断一个对应框架的版本号解决。