这次在做项目的时候,遇到一个比较麻烦的点就是要查询全面信息,和插入数据量比较大的数据,刚刚开始呢,一个一个插入和一个个查询比较麻烦,咨询了他们两个解决方案
① 批量查询和批量插入,这个还只是针对数据不是特别大的时候,正好这次的项目是1w条插入和没有规定的条数的查询
② 如果以后数据量非常大的时候几十万,百万的时候这个速度就算批量也可能很慢了,这时候建议的是异步处理@Async,就是插入刚刚开始的时候添加一个loading的状态,直接返回(其实觉得这个应该是只是针对没有返回什么数据格式的时候)这个时候特别适用这个
将第一种方案代码
public List<String> getDistinct(List<String> list,Integer type,Long userId,List<String> fails){ Integer total = list.size(); int limit = 2000; List<Barcode> sameBarcode = Lists.newArrayList(); List<String> distinctString = Lists.newArrayList(); for (int i = total; i>0; i=i-limit) { List<String> listString = list.subList(i-limit<0?0:i-limit,i); List<Barcode> barcodeList = barcodeDao.findByNumbers(userId,listString,type.toString()); sameBarcode.addAll(barcodeList); } for (Barcode barcode:sameBarcode){ distinctString.add(barcode.getNumber()); } HashSet h1 = new HashSet(list); HashSet h2 = new HashSet(distinctString); h1.removeAll(h2); List<String> list1 = new ArrayList(h1); fails.addAll(distinctString); return list1; }
插入代码
Integer total = success.size(); int limit = 1000; for (int i = total; i>0; i=i-limit) { List<Barcode> listBanth = barcodeList.subList(i-limit<0?0:i-limit,i); barcodeDao.saveBarth(listBanth); }
sql写法
@Insert("<script>" + "insert into `barcode` (`type`, `user_id`, `number`, `created_time`, `status`, `import_id`,`country_code`,`makers_code`,`generation_type`,`product_code`)values" + "<foreach collection=\"array\" item=\"item\" index=\"index\" separator=\",\">" + " (#{item.type} ,#{item.userId} ,#{item.number}, #{item.createdTime}, #{item.status} ,#{item.importId},#{item.countryCode},#{item.makersCode},#{item.generationType},#{item.productCode})" + "</foreach>" + "</script>") void saveBarth(@Param("array")List<Barcode> orders);