- 有一张excel表格。里面有6万条数据。客户给的库存表格。可能实际数量比这个大一点,但是出入可能不会太大。
- 现在要做的就是快速的插入到表里面。争取控制到一分钟内响应到前端。
- 就是一条一条的插入
- 网上百度到的,说是通过写mysql存储过程来存。说是这个办法快点。但是我没有试,因为我不怎么会写存储过程。看文章的大体思路是说,先把数据写到一个文件中。再用mysql去读取这个文件,然后再插入。感觉网上这么做的人挺多的,但是这个办法,执行起来对我来说难度较大。
- 分批插入,就是把这几万条数据拆分为小的集合,然后在用insert into values 这个一次性插入多条的进行插入。这里面可以加入线程。可以提高速度。(但是我没有加线程,目前分批插入对我来说已经够用了)
System.out.println(new Date()); if(list.size()>0){ List耗时65秒 3.2 看一下采用分批插入的所耗费的时间(这里用的是plus里面的plus里面saveBatch这个方法,没用过的请自行百度)> ck = ck(collect, 400); System.out.println("list集合大小-"+collect.size()); for (int m = 0; m < ck.size(); m++) { for (int tt = 0; tt < ck.get(m).size(); tt++) { ck.get(m).get(tt).setId(uuid()); //一个一个插入 tjInventoryMapper.insert(ck.get(m).get(tt)); } // tjinventoryService.saveBatch(ck.get(m)); } } System.out.println(new Date());
System.out.println(new Date()); if(list.size()>0){ //这里是把这6万条数据拆分成每个400条数据的集合 List耗时24秒 明显看出来分批插入是占有优势的了。响应速度也是比那个一条一条的插入速度快很多。提高了有两倍的性能 4.这里说一下这么写需要注意的几个点。> ck = ck(collect, 400); System.out.println("list集合大小-"+collect.size()); for (int m = 0; m < ck.size(); m++) { for (int tt = 0; tt < ck.get(m).size(); tt++) { ck.get(m).get(tt).setId(uuid()); //一个一个插入 // tjInventoryMapper.insert(ck.get(m).get(tt)); } tjinventoryService.saveBatch(ck.get(m)); } } System.out.println(new Date());
- 因为mysql数据库插入语句有大小的限制,我百度到的是4M,所以这里不能一次性全部插入,mysql会报异常的。这里我一次插入400个试题对象 。
- 我数据库主键不是做的自增。做的字符串类型。这里批量插入的话,不知道是什么原因,总是报错,主键重复
所以,我在遍历的时候给每个试题对象插入了一个UUID,保证不重复。
public List> ck(List
list,Integer max){ ArrayList > lists = new ArrayList<>(); //5 0 1 2 3 4 max 2 Integer i=list.size()%max; ArrayList
strings = new ArrayList<>(); for(int j=0;jmax) { for (int q = 0; q < list.size() / max; q++) { ArrayList tjInventories1 = new ArrayList (); for (int k = q * max; k <= ((q + 1) * max - 1); k++) { tjInventories1.add(list.get(k)); } lists.add(tjInventories1); } } return lists; }
这里面 “ TjInventory ” 是我自己用到的实体对象。你们用的话可以把里面的实体对象名换成你们自己的实体对象就ok。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)