Mybatis 并发执行导致cpu占满的问题
Posted zr824946511
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis 并发执行导致cpu占满的问题相关的知识,希望对你有一定的参考价值。
最近线上服务经常 出现cpu达到100%的问题,发现都是执行oracle操作的方法就没有返回。经过排查,最后定位到cpu消耗在以下方法
System.Collections.Generic.Dictionary`2<system.type,system.boolean>.FindEntry (...)
System.Collections.Generic.Dictionary`2<system.__canon,system.boolean>.TryGetValue (...)
MyBatis.DataMapper.TypeHandlers.TypeHandlerFactory.IsSimpleType (...)
MyBatis.DataMapper.DataExchange.ComplexDataExchange.GetData (...)
MyBatis.DataMapper.Model.ParameterMapping.ParameterMap.SetParameter (...)
MyBatis.DataMapper.Data.DefaultPreparedCommand.ApplyParameterMap (...)
MyBatis.DataMapper.Data.DefaultPreparedCommand.Create (...)
MyBatis.DataMapper.MappedStatements.MappedStatement.Execute (...)
MyBatis.DataMapper.MappedStatements.MappedStatement.ExecuteUpdate (...)
MyBatis.DataMapper.DataMapper.Update (...)
查看IsSimpleType方法内部实现
public bool IsSimpleType(Type type) { bool result = false; if (!simpleTypes.TryGetValue(type, out result)) { if (type != null) { ITypeHandler handler = GetTypeHandler(type, null); if (handler != null) { result = handler.IsSimpleType; } simpleTypes[type] = result; } } return result; }
Dictionary 操作没有加锁,get和set并发执行时就有几率导致cpu占满,方法无法跳出
以上是关于Mybatis 并发执行导致cpu占满的问题的主要内容,如果未能解决你的问题,请参考以下文章