欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分批查询 博客分类: 实战技术 分批查询查询分批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;
	}