分批查询 博客分类: 实战技术 分批查询查询分批mybatis
程序员文章站
2024-03-18 10:38:46
...
package com.xxxpiao.common.utils; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.apache.commons.lang.ArrayUtils; public class CollectionUtils { /** * 分批处理数组的工具类 * * @param collections * 需要处理的数组集合 * @param callBack * 处理数组的回调函数 * @param size * 每批处理的个数 */ @SuppressWarnings("unchecked") public static <E extends Object> void splitCollectionHandle(List<E> collections, ListCollectionCallback<E> callBack, int size) { if (collections == null || collections.isEmpty()) return; int collectionSize = collections.size(); if (collectionSize < size) { callBack.call(collections); return; } int forCount = collectionSize / size; int mode = collectionSize % size; Object[] objectArr = collections.toArray(); for (int i = 0; i < forCount; i++) { Object[] tempArr = ArrayUtils.subarray(objectArr, i * size, (i + 1) * size); List<E> objectList = (List<E>) Arrays.asList(tempArr); callBack.call(objectList); } if (mode > 0) { Object[] tempArr = ArrayUtils.subarray(objectArr, size * forCount, size * forCount + mode); List<E> objectList = (List<E>) Arrays.asList(tempArr); callBack.call(objectList); } } /** * 分组调用callBack里的业务,异步调用,全部组调用完后同步 * * @param collections * 需要处理的数组集合 * @param callBack * 处理数组的回调函数 * @param size * 每批处理的个数 */ @SuppressWarnings("unchecked") public static <E extends Object> void splitCollectionAsyncCall(List<E> collections, ListCollectionCallback<E> callBack, int size) throws InterruptedException, ExecutionException,Exception{ if (collections == null || collections.isEmpty()) return; int collectionSize = collections.size(); if (collectionSize < size) { callBack.call(collections); return; } class AsyncCall implements Runnable{ ListCollectionCallback<E> callBack=null; List<E> objectList = null; public AsyncCall(ListCollectionCallback<E> callBack,List<E> objectList){ this.callBack =callBack; this.objectList = objectList; } public void run(){ callBack.call(objectList); } } int forCount = collectionSize / size; int mode = collectionSize % size; final ExecutorService exePool = Executors.newFixedThreadPool(forCount+(mode>0?1:0));//每个组一个线程 final List<Future<?>> dataList = new ArrayList<Future<?>>(); Object[] objectArr = collections.toArray(); for (int i = 0; i < forCount; i++) { Object[] tempArr = ArrayUtils.subarray(objectArr, i * size, (i + 1) * size); List<E> objectList = (List<E>) Arrays.asList(tempArr); Future<?> future = (Future<?>) exePool.submit(new AsyncCall(callBack,objectList)) ; dataList.add(future); } if (mode > 0) { Object[] tempArr = ArrayUtils.subarray(objectArr, size * forCount, size * forCount + mode); List<E> objectList = (List<E>) Arrays.asList(tempArr); Future<?> future = (Future<?>) exePool.submit(new AsyncCall(callBack,objectList)) ; dataList.add(future); } List<Exception> exceptionlist = new ArrayList<Exception>(); for (Future<?> future : dataList) {//同步 try { future.get(); } catch (InterruptedException e) { exceptionlist.add(e); } catch (ExecutionException e) { exceptionlist.add(e); } catch (Exception e) { exceptionlist.add(e); } } if(!exceptionlist.isEmpty()){ exePool.shutdown(); throw exceptionlist.get(0); } exePool.shutdown(); } public static void main(String[] args){ return; } public static <E extends Object> void splitCollectionHandle(Collection<E> collections, CollectionCallback<E> callBack, int size) { if (collections == null || collections.isEmpty()) return; int collectionSize = collections.size(); if (collectionSize < size) { callBack.call(collections); return; } int forCount = collectionSize / size; int mode = collectionSize % size; Object[] objectArr = collections.toArray(); for (int i = 0; i < forCount; i++) { Object[] tempArr = ArrayUtils.subarray(objectArr, i * size, (i + 1) * size); List<E> objectList = (List<E>) Arrays.asList(tempArr); callBack.call(objectList); } if (mode > 0) { Object[] tempArr = ArrayUtils.subarray(objectArr, size * forCount, size * forCount + mode); List<E> objectList = (List<E>) Arrays.asList(tempArr); callBack.call(objectList); } } public static Map<String, Object> changeDbStyleKeyToJavaStyleKey(Map<String, Object> sourceMap) { if (null == sourceMap) { return sourceMap; } Map<String, Object> targetMap = new HashMap<String, Object>(); for (Entry<String, Object> entry : sourceMap.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); targetMap.put(StringUtil.changeDbcloumStyleToJavaStyle(key), value); } return targetMap; } /** * 把LIST中类型为简单对象类型INTERGER,LONG ...里的值转为逗号分隔的串 1,2,3 * 满足IN查询需要 * @param list * @return NULL或SIZE<1时返回 '' * @create_time 2012-9-22 下午04:43:39 */ public static String listToString(List<?> list){ if(list==null || list.size()<1){ return ""; } StringBuffer s = new StringBuffer(512); for(Object o :list){ s.append(o.toString().trim()+","); } if(s.length()>0) s.deleteCharAt(s.length()-1); return s.toString(); } public static String collectionToString(Collection<?> list){ if(list==null || list.size()<1){ return ""; } StringBuffer s = new StringBuffer(512); for(Object o :list){ s.append(o.toString().trim()+","); } if(s.length()>0) s.deleteCharAt(s.length()-1); return s.toString(); } }
package com.xxxpiao.common.utils; import java.util.Collection; public interface CollectionCallback<E extends Object> { public void call(Collection<E> collection); }
@Override public Map<String, BetPlan> queryBetPlanMapByPlanNoList(Collection<String> planNoSet) { final Map<String, BetPlan> resultMap = new HashMap<String, BetPlan>(); if (planNoSet == null || planNoSet.isEmpty()) { return resultMap; } CollectionCallback<String> callback = new CollectionCallback<String>() { @Override public void call(Collection<String> collection) { Map<String, Object> paramMap = new HashMap<String, Object>(); String planNoList = StringUtils.join(collection, ","); paramMap.put("planNoList", planNoList); List<BetPlan> betPlanList = betDbDao.queryList("BetPlanDao.queryBetPlanByPlanNoSet", paramMap); for (BetPlan betPlan : betPlanList) { resultMap.put(betPlan.getPlanNo(), betPlan); } } }; com.xxxpiao.common.utils.CollectionUtils.splitCollectionHandle(planNoSet, callback, 50); return resultMap; }
上一篇: Oracle_多条语句的更新操作 博客分类: 7.数据库
下一篇: 多线程实现烟花效果