2019-01-15

                     一个mybatis的bug追踪


1、背景

注意:这个bug在mybatis的 3.4.0版本中出现

前一段时间参与一个项目的开发,在排查一个功能问题的时候发现一部分机器的业务日志中存在少量的mybatis异常,主要异常信息如下:

  “  Error evaluating expression 'criteria.valid'. Cause: org.apache.ibatis.ognl.NoSuchPropertyException: criteria.valid ”

   而这一代码存在的位置是实体类对应的 mapper的xml配置文件中,我看了下就是简单的布尔判断,如果有问题的话早就报出来才对,在github的mybatis项目bug处找到了一些线索提示可能是并发导致的,然后仔细分析了机器的日志,发现当时的日志量特别大,和相关同学确认了一下当时在进行压测,大并发的情况下出现问题和mybatis项目bug的提示相符合,下面进行具体的问题排查。

2、追踪过程:

从错误信息中可以看出来是ognl分析查询条件出了问题,本文主要讲述这个问题的原因及排查问题的主要代码,ognl的相关内容以及mybatis如何使用ognl不是本文的内容。

步骤一、找到这个类发现这个调用是一个对象的方法调用,判断是否有查询条件。

步骤二、既然是方法调用,那就查看ognl的方法调用过程,这个方法所在类:

org.apache.ibatis.ognl.OgnlRuntime

主要用到的方法:

这个方法内部主要是通过红线圈住的两个地方来获取该方法,其实就是两个方法,一个方法是

getGetMethod(参数自己看哈),另一个方法是getReadMethod(参数自己看),注意看getReadMethod方法调用传入的最后一个参数0,这个比较重要,后面会分析。

跟踪进入方法getGetMethod:

现在我们来分析一下这个方法返回null的原因,当同时有两个线程同时进入方法getGetMethod

内而且从map中取得的值都是null的时候,也就是这一步

Method method = cacheGetMethod.get(targetClass, propertyName);

返回的都是null的时候两个线程都进入到下面的代码,当一个线程执行了下面红线圈起来的地方,cacheGetMethod.put(targetClass, propertyName, method);,之后另一个线程执行了

   else if (cacheGetMethod.containsKey(targetClass, propertyName)) {

        return null;

   }

所以这一个线程从该方法取得的method=null。那么根据图一,下一步执行到方法

getReadMethod中,下面分析这个方法:

注意我们上面说到的,当numParams=0的时候,会跳过方法的中间大部分代码而进入到最下面的代码,当第一次进来的时候,传进来的方法名没有以get开头,那么会把这个方法名和get字符串拼接起来,递归调用getReadMethod,然后还是进入到最下面的部分,method=null,而且这次方法名是以get开头,那么根据条件会返回null, 也就是说,如果传入的参数numParams=0,那么这个方法永远返回的都是null, 至此可以分析得到的结果是,mybatis自身在高并发的情况下获取方法的代码不是线程安全的。

解决办法:把mybatis版本升级到最新版本,我升级到版本 3.4.6就没有这个问题了,由于篇幅原因这里不再介绍3.4.6是如何解决这个问题的,大家感兴趣可以自己去研究一下,以上分析,如有不当,欢迎指正,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容