回想那天让我虎躯一震的bug:Mybatis Ognl引起的异常

本文介绍了作者在线上项目遇到的一个由Mybatis Ognl引起的并发bug,详细分析了异常堆栈、排查过程以及Mybatis的解析执行流程。在3.3.0版本以前,Mybatis的Ognl表达式解析存在并发问题,可能导致NPE。作者通过模拟并发环境,定位到问题关键点,并提供了相关修复版本和参考资料。
摘要由CSDN通过智能技术生成

最近线上项目的关键环节突然抛出了一个数据库访问的空指针异常,不免神经一紧,经过最终排查,确认了该问题属于mybatis 3.3.0(不包含)以下版本已存在的bug,新版本的mybatis已经修复,具体情况如下:
系统jar版本
在这里插入图片描述
异常堆栈
在这里插入图片描述

排查过程

  1. 根据堆栈信息,初步确定是mybatis的解析执行异常,通过搜索引擎进一步查证,该问题属于mybatis低版本中存在的并发bug,问题发生时也确实存在多个线程并发访问同一sql
    在这里插入图片描述
    需进一步确认具体原因。
  2. 由于之前对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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>