本篇效率一般-仅为记录
详细思路请看springboot读取本地大文档1G目录导航–7
插入十万行左右最高效参考
插入千万行以上最高效参考
分为三层
1.controller层
@ApiOperation("insert接口-Bach&Foreach添加数据")
@RequestMapping(value = "insertTableBachForeach", method = RequestMethod.POST)
@ResponseBody
public void insertTableBachForeachController(){
tsi.insertTableBachForeachService();
}
2.service层
接口
void insertTableBachForeachService();
实现类
/*1.bach foreach*/
@Override
public void insertTableBachForeachService() {
//新获取一个模式为BATCH,自动提交为false的session
//如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(
ExecutorType.BATCH, false);
//1.通过新的session获取mapper
tm = session.getMapper(TableMapper.class);
/*197次后批量提交
* 每次调用foreach 提交1000条
* 3
* 10*/
try {
/*2.获取file*/
File file = new File("D:/data/allCountries.txt");
/*3.将file文件存入arraylist中 此处调用工具类ReadTxt.txt2String(file)方法*/
ArrayList<Geoname> al = ReadTxt.txt2String(file);
/*4.每次1000条 分为size次*/
int size = al.size()/1000;
/*5.遍历size次*/
for (int i = 1; i <= size+1; i++) {
/*6.记录每1000条执行所需时间*/
long time1 = System.currentTimeMillis();
/*7.获取list集合中指定下标范围内的数据 例如 当i= 2 获取2000 到 3000条数据*/
List<Geoname> real = ReadTxt.getReal(al,i);
/*8.插入到数据库*/
tm.insertTable(real);
/*9.每1000 * 10 条 提交一次 */
if(i%10==0){
//手动每10000个一提交,提交后无法回滚
session.commit();
//清理缓存,防止溢出
session.clearCache();
}
long time2 = System.currentTimeMillis();
System.out.println("第"+i+"次耗时:"+(time2-time1));
}
/*最后再提交一次*/
//手动每10000个一提交,提交后无法回滚
session.commit();
//清理缓存,防止溢出
session.clearCache();
} catch (Exception e) {
//没有提交的数据可以回滚
session.rollback();
} finally {
session.close();
}
}
工具类
model类
3.mapper层
接口
实现类
同6.Springboot-mbatis读取txt文档(十万行)插入到数据库-foreach方式
的工具类 model类 3.mapper层 接口 实现类
完毕!