使用MyBatis的foreach批量插入大量数据到GBase8s数据库时,性能会很低。下面探讨怎么优化此问题。
1、mapper configuration的foreach 配置及原因分析
insert into user (id, name) values
(
#{model.id},
#{model.name}
)
乍看上去这个foreach没有问题,但是经过项目实践发现,当表的列数较多(20+),以及一次性插入的行数较多(5000+)时,整个插入的耗时十分漫长,达到了14分钟,这是不能容忍的。
从资料中可知,默认执行器类型为Simple,会为每个语句创建一个新的预处理语句,也就是创建一个PreparedStatement对象。在我们的项目中,会不停地使用批量插入这个方法,而因为MyBatis对于含有的语句,无法采用缓存,那么在每次调用方法时,都会重新解析sql语句。
从分析得知,耗时就耗在,由于我foreach后有5000+个values,所以这个PreparedStatement特别长,包含了很多占位符,对于占位符和参数的映射尤其耗时。并且,查阅相关资料可知,values的增长与所需的解析时间,是呈指数型增长的。
优化GBase8s-MyBatis foreach性能问题
最新推荐文章于 2024-05-04 18:55:40 发布