应用场景:导入数据时获取到Excel表格中几万条数据,需要把这些数据存入数据库
数据量过大时tomcat启动中可能出现内存溢出的情况,这时可以在tomcat的bin目录下的catalina.bat的最开头添加如下代码:
set JAVA_OPTS=%JAVA_OPTS% -Xms512M -Xmx1024M -server -XX:PermSize=512M -XX:MaxPermSize=1024M
下面就是开始添加数据了
int batchSaveLandData(@Param("tlandDatas")List<TlandData> tlandDatas);
<insert id="batchSaveLandData">
insert into t_land_data(lid,fid,ofid,type,x,y,updatetime,createtime)
values
<foreach collection="tlandDatas" item="item" separator=",">
(#{item.lid},#{item.fid},#{item.ofid},#{item.type},#{item.x},#{item.y},now(),now())
</foreach>
</insert>
@Transactional(readOnly=false)
public int batchSave(List<TlandData> list) {
return tlandDataDao.batchSaveLandData(list);
}
Excel导入的数据在工具类方法中会把数据解析并存入集合中,我们在存导入的数据到数据库时,不推荐直接调用批量新增方法,这样保存数据相应会慢很多,将list拆开来分批新增能使新增数据速度大大提升,在测试时以80到100条分批插入数据是最快的,当然,也可以自己再测试一次,不同配置的电脑性能方面是不同的
if (li1 != null && li1.size() >0) {
int size = li1.size();
int limitSize = 80; // 限制条数(测试时80-100左右速度最快)
if (limitSize < size) {
int part = size % limitSize > 0 ? (size / limitSize + 1) : size / limitSize; // 分批数
for (int i = 0; i <= part; i++) {
if (limitSize < li1.size()) {
List<TlandData> listPage = li1.subList(0, limitSize);
tlandDataService.batchSave(listPage);
// 将已添加的数据去掉
li1.subList(0, limitSize).clear();
} else {
tlandDataService.batchSave(li1);
}
}
} else {
tlandDataService.batchSave(li1);
}
}