`
jin8000608172
  • 浏览: 140202 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

分批查询

阅读更多
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;
	}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    SQL语句用于分批显示结果 分页

    这里,你需要首先查询出前`每页显示数*(当前页数-1)`条记录,然后从主查询中排除这些记录,以获取下一页的数据。 3. Oracle 分页 Oracle 使用 `ROWNUM` 属性来限制返回的行数。然而,由于 `ROWNUM` 在查询时就确定...

    android分批加载

    由于查询大量数据可能导致性能下降,因此采用分批查询策略是必要的。例如,可以设置一个批次大小,每次查询这个数量的数据。使用`LIMIT`和`OFFSET` SQL语句实现分页查询: ```sql SELECT * FROM table_name LIMIT ...

    JAVA使用线程池查询大批量数据

    本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。线程池是一种多线程处理形式,预先创建了若干个线程,当有任务需要执行时,会从线程池中取出...

    java一次性查询处理几百万数据解决方法

    1. **分批处理**:避免一次性加载所有数据到内存中,而是采用分批次的方式进行查询和处理。 2. **合理设置查询参数**:例如设置`setFetchSize`来控制每次获取的数据量,减少内存压力。 3. **结果集的优化**:使用...

    GameShardingDb:基于spring-sharding-mybaits集成的redis缓存的游戏分布式存储框架。支持将对象序列化到串联里,重新存储。使用spring集成mybatis3垂直和水平分库MySQL。变化的尺度,自动完成拼写sql,降低数据库落地缺陷集成Mybatis-PageHelper分页,大数据量可以分批查询。提高查询速度

    使用模版编程,采用代理模式,采集变化的细分,自动完成拼写SQL,降低数据库落地缺陷集成Mybatis-PageHelper分页,大数据量可以分批查询,提升查询速度 将同步存储可变落地抽象为EntityService,具体存储服务可继承...

    参照工具数据库数据多列模糊查询

    3. **分块查询**:如果数据量过大,可以尝试分批查询,每次处理一部分数据,以减轻数据库系统的压力。 4. **使用全文搜索引擎**:如Elasticsearch或Solr,它们专门设计用于高效处理模糊和多列查询,尤其适合大数据...

    收录批量查询工具

    - **合理分批查询**:为了避免给搜索引擎带来过多负担,建议将大量URL分成小批次进行查询。 - **定期监测**:定期使用工具进行收录查询,及时发现收录问题并采取措施。 - **结合其他工具**:与关键词分析、网站...

    Oracle 批查询

    bulk collect在 select ... into、fetch ... into、returning ... into中的应用。

    Excel百万级别数据的导入和导出

    数据库可以提供高效的查询和数据管理功能,同时支持批量导入导出。 7. **数据预处理**:在导入Excel前,对数据进行清洗和预处理,如删除重复项、填充缺失值、转换数据类型,可以提高导入效率和数据质量。 8. **...

    ListView 加载

    1、ListView 分页加载(主要是要搞明白数据库的查询操作: Cursor cursor = db.rawQuery("select * from test limit ? offset ?", new String[]{ ...4、SQLite 数据库的增删改查(分页查询、分批查询操作)

    华华快递查询助手+1.1+绿色版.rar

    用户可以一次性输入多个快递单号,软件会自动分批查询并显示所有包裹的状态,极大地提高了工作效率。 4. **实时更新** 软件能够实时同步快递公司的最新数据,确保用户获得的信息是最准确、最新的。一旦快递状态有...

    多线程导出Excel(百万级别)_Java版优化.zip

    用开源 Apache POI 技术导出Excel,解决导出大数据出现OOM、栈溢出问题,此资源可实现百万级数据多线程分批导出Excel文件,不会内存溢出,生产环境已很稳定的使用者,所以用到的技术很核心、值得参考

    纯前端模糊查询和数据的分批加载demo

    "纯前端模糊查询和数据的分批加载demo"是一个很好的实践案例,它涵盖了如何仅使用JavaScript实现前端模糊查询以及如何通过分批加载来优化DOM性能。下面我们将深入探讨这两个核心知识点。 一、JavaScript模糊查询 1...

    PHP实例开发源码-PHP多站点批量收录查询.zip

    6. **性能优化**:对于大量网站的查询,可能需要考虑使用异步处理、队列或者分批查询来避免过大的负载。 7. **API调用频率控制**:为了遵守搜索引擎的使用政策,避免被封禁,源码可能包含对API调用频率的控制,如...

    oracle查询优化

    此时可以通过分批查询、增加过滤条件等方式减少返回的结果集大小。 7. **锁或死锁** 锁机制是用来保证数据一致性的重要手段,但不当的使用会导致查询等待时间过长甚至出现死锁情况,严重影响查询性能。 8. **SP_...

    109 案例实战:千万级用户场景下的运营系统SQL调优(1).pdf

    4. 批量处理优化:对于大数据量的处理,可以继续使用分批查询的方式,但需考虑调整每次分批的数量。通过分析数据分布和读取效率,找到一个平衡点,既能减少每次查询的耗时,又能尽量减少查询的总次数。 5. 使用持久...

    Sql server优化50法

    6. **数据量过大**:查询返回过多数据会导致性能下降,通过优化查询逻辑或使用分批查询可以缓解此问题。 7. **锁和死锁**:并发控制不当会导致锁竞争,从而影响查询速度。优化锁策略和避免死锁是必要的。 8. **...

    解决PHP里大量数据循环时内存耗尽的方法

    - 使用LIMIT和OFFSET来进行分批查询,减少单次查询的数据量。 - 释放不再使用的变量,例如使用unset()函数。 - 在处理大型数组或对象时,使用unset()来移除不再需要的部分。 - 定期清理内存,例如使用sleep()函数让...

    mysql C API

    change log: 1. 2006年 初始版本发布,主要封装一些访问 MYSQL 的 C API,能便捷的访问 MYSQL 数据库; 2. 2010年 版本是原来版本的修正版本; 主要增加功能如下: ...3. 增加分批查询数据(limit+offset)形式;

    VirtualTrees增加日期控件或其它控件的方法

    1. 设计查询语句:编写SQL语句,根据需求进行筛选,如按日期范围分批查询。 2. 批量处理:通过循环或批量操作接口,分批获取数据,避免一次性加载大量数据导致内存压力。 3. 数据转换:将查询结果转换为适合...

Global site tag (gtag.js) - Google Analytics