当前使用版本(必填,否则不予处理)

3.5.3.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

调用Mybatis的OGNL解析的时候,Warpper类中的nonEmptyOfWhere方法的Method没有正确的缓存,导致每次想要去调用这个方法的时候都会重新去获取新的Method对象。重新获取到的Mthod对象会受软引用回收的影响,导致有可能重复去创建反射字节码类,进一步有可能会在运行一段时间之后出现Metaspace的OOM。

重现步骤(如果有就写完整)

以下是调用已存在的测试案例ActiveRecordTest.testUpdate(),断点走到org.apache.ibatis.ognl.getGetMethod(OgnlContext context, Class targetClass, String propertyName)cacheGetMethod里面的缓存状态。 MyBatis-Plus Warpper类中方法在OGNL解析的时,Method没有被正确缓存

可以看到,通过_getGetMethod(context, targetClass, propertyName)返回的method为null。因为在这个方法中,只有方法符合JavaBean的命名规范(get、set、is开头)才会返回对应的method。 同理其他两个nonEmptyOfNormalnonEmptyOfEntity也有相同的问题。

报错信息

系统运行一段时间后,元空间不足

Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '' and ew.nonEmptyOfWhere'. Cause: org.apache.ibatis.og nl.OgnlException: sqlSegment [java.lang.OutOfMemoryError: Metaspace] at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:48) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at java.util.ArrayList.forEach(ArrayList.java:1249) ~[?:1.8.0_141] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at java.util.ArrayList.forEach(ArrayList.java:1249) ~[?:1.8.0_141] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:35) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at java.util.ArrayList.forEach(ArrayList.java:1249) ~[?:1.8.0_141] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:39) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:305) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.executor.statement.BaseStatementHandler.(BaseStatementHandler.java:64) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.executor.statement.PreparedStatementHandler.(PreparedStatementHandler.java:41) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.executor.statement.RoutingStatementHandler.(RoutingStatementHandler.java:46) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:658) ~[mybatis-3.5.6.jar:3.5.6] at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doUpdate(MybatisSimpleExecutor.java:52) ~[mybatis-plus-core-3.3.0.jar:3.3.0] at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.6.jar:3.5.6] at sun.reflect.GeneratedMethodAccessor509.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_141] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_141] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ~[mybatis-spring-2.0.3.jar:2.0.3] ... 17 more Caused by: org.apache.ibatis.ognl.OgnlException: sqlSegment at org.apache.ibatis.ognl.OgnlRuntime.getMethodValue(OgnlRuntime.java:2162) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.ObjectPropertyAccessor.getPossibleProperty(ObjectPropertyAccessor.java:66) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:160) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:3338) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:121) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.ASTChain.getValueBody(ASTChain.java:141) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:560) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:524) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:46) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at java.util.ArrayList.forEach(ArrayList.java:1249) ~[?:1.8.0_141] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55) ~[mybatis-3.5.6.jar:3.5.6] at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32) ~[mybatis-3.5.6.jar:3.5.6] at java.util.ArrayList.forEach(ArrayList.java:1249) ~[?:1.8.0_141]