这次在做项目的时候,遇到一个比较麻烦的点就是要查询全面信息,和插入数据量比较大的数据,刚刚开始呢,一个一个插入和一个个查询比较麻烦,咨询了他们两个解决方案
① 批量查询和批量插入,这个还只是针对数据不是特别大的时候,正好这次的项目是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);
|