最近线上项目的关键环节突然抛出了一个数据库访问的空指针异常,不免神经一紧,经过最终排查,确认了该问题属于mybatis 3.3.0(不包含)以下版本已存在的bug,新版本的mybatis已经修复,具体情况如下:
系统jar版本
异常堆栈
排查过程
- 根据堆栈信息,初步确定是mybatis的解析执行异常,通过搜索引擎进一步查证,该问题属于mybatis低版本中存在的并发bug,问题发生时也确实存在多个线程并发访问同一sql
需进一步确认具体原因。 - 由于之前对mybatis执行过程中mapper文件中定义的mappedStatement的sql语句的解析构建及参数绑定了解不够充分,故结合日志中的异常sql语句,在dev环境进行模拟,熟悉执行流程:
项目启动阶段进行mapper文件的解析,构建XML的结构化对象
org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode解析statement, 并将结果维护在org.apache.ibatis.session.Configuration 的statementMap<statementId, statement>中,用于sql执行时依据statementId获取对应的statement