前言:
当前同学们对“mysql光标没了”大体比较关怀,咱们都需要了解一些“mysql光标没了”的相关资讯。那么小编在网上网罗了一些关于“mysql光标没了””的相关内容,希望朋友们能喜欢,同学们快快来学习一下吧!今天开发了一个批量导入数据的功能,导入的数据使用mybatis框架持久化到mysql数据库。由于导入的数据量较大,需要分批插入到库表中。这个功能并不复杂,但是在调试的过程中却爆出了空指针异常。
以前听说subList使用不当,会出问题,可没听说过会空指针啊,难道是我又犯了啥低级错误。下面看看我写的代码:
int. batchSize = 1000;int remaider = importList.size()%batchSize;int. loop = importList.size()/batchSize;loop = remaider==0?loop:(loop+1);for(int i=1;i<=loop;i++){ int endIndex = (i==loop)?importList.size():i*loop; List<TaxDO>. insertList = importList.subList((i-1)*batchSize,endIndex); taxMapper.batchInsert(insertList);}
这段代码本身并没有问题,而是公司封装的mybatis的插件里爆出了空指针异常。
公司将敏感词的处理逻辑封装在mybatis的插件中。插件中有一行代码如下:
(Collection)ReflectUtil.newInstanceIfPossible(param.getClass())
param为subList类型数据时,这行代码返回值为null,后续会向这个返回的集合放数据,空指针异常就出现了。
插件是打到jar包里面的,没法对代码进行修改。因此我们不能用subList视图数据进行批量插入。
修改如下:
int. batchSize = 1000;int remaider = importList.size()%batchSize;int. loop = importList.size()/batchSize;loop = remaider==0?loop:(loop+1);List<String>. newList = Lists.newArrayList();for(int i=1;i<=loop;i++){ int endIndex = (i==loop)?importList.size():i*loop; List<TaxDO>. insertList = importList.subList((i-1)*batchSize,endIndex); newList.addAll(insertList); //不实用subList插入数据,避免插件处理空指针 taxMapper.batchInsert(newList); //清空下数据,供下次使用 newList.clear();}
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #mysql光标没了