這次在做項目的時候,遇到一個比較麻煩的點就是要查詢全面信息,和插入數據量比較大的數據,剛剛開始呢,一個一個插入和一個個查詢比較麻煩,咨詢了他們兩個解決方案
① 批量查詢和批量插入,這個還只是針對數據不是特別大的時候,正好這次的項目是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);