Mybatis3.2.3 PropertyTokenizer NullPointerException

线上环境,mybatis3.2.3版本,高并发情况下,出现空指针异常,下面是异常明细。

         Caused by: org.apache.ibatis.exceptions.PersistenceException:

         ### Error updating database.  Cause: java.lang.NullPointerException

         ### Cause: java.lang.NullPointerException

                   at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)

                   at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:150)

                   at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:137)

                   at sun.reflect.GeneratedMethodAccessor180.invoke(Unknown Source)

                   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

                   at java.lang.reflect.Method.invoke(Method.java:606)

                   at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)

                   ... 48 more

         Caused by: java.lang.NullPointerException

                   at org.apache.ibatis.reflection.property.PropertyTokenizer.<init>(PropertyTokenizer.java:27)

                   at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:104)

                   at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:94)

                   at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:113)

                   at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:1657)

                   at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:92)

                   at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170)

                   at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:210)

                   at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:49)

                   at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:170)

                   at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:210)

                   at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:333)

                   at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:413)

                   at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:395)

                   at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:45)

                   at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:29)

                   at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:30)

                   at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:29)

                   at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:51)

                   at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:29)

                   at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:37)

                   at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:275)

                   at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:61)

                   at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:36)

                   at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:42)

                   at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:464)

                   at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:43)

                   at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:100)

                   at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)

                   at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:148)

                   ... 53 more

 

这个是mybatis使用的ognl2.6.9的一个bug,关于这个bug,官网上有记录:https://github.com/mybatis/mybatis-3/issues/224

并发情况下,不仅仅这一个NPE的bug,还有其他一些类似的并发问题,比如https://blog.csdn.net/mj158518/article/details/52185949/    这篇文章中提到了OgnlRuntime.invokeMethod的并发问题,但归根结底其实是相同的同步代码导致: org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:29)。

我们的解决方式是,MyBatis升级到最新的3.4.1版本,同时也需要将mybatis-spring升级到1.3.0版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值