一次针对批量查询处理的优化

简介:
  客户调用批量查询接口对Solr核进行查询时觉得查询响应时间有些慢,接口的内部实现目前是顺序执行每个查询,再把结果汇总起来返回给调用方。因此,考虑引入线程池对查询接口的内部实现进行重构优化。

       先声明一个大小可随之增长的线程池,

private ExecutorService executor = Executors.newCachedThreadPool();//查询请求处理线程池
     然后是主线程方法的代码:

     public List<Map<String, String>> queryEntityList(String entityCode, List<Long> idList) throws ServiceException {

复制代码
        List<Map<String, String>> finalResult = null;
        if (idList == null || idList.size() == 0 || StringUtil.isBlank(entityCode)) {//参数合法性校验
            return finalResult;
        }
        finalResult = new ArrayList<Map<String, String>>();
        
        List<Future<Map<String, String>>> futureList = new ArrayList<Future<Map<String, String>>>();
        int threadNum = idList.size();//查询子线程数目
        for (int i = 0; i < threadNum; i++) {
            Long itemId = idList.get(i);
            Future<Map<String, String>> future = executor.submit(new QueryCallable (entityCode, itemId));
            futureList.add(future);
        }
        for(Future<Map<String, String>> future : futureList) {
            Map<String, String> threadResult = null;
            try {
                threadResult = future.get();
            } catch (Exception e) { 
                threadResult = null;
            }
            if (null != threadResult && threadResult.size() > 0) {//结果集不为空
                finalResult.add(threadResult);
            }
        }
        return finalResult;
    }
复制代码
    最后是具体负责处理每个查询请求的Callable
 复制代码
public class QueryCallable implements Callable<Map<String, String>> {
        private String entityCode = "";
        private Long itemId = 0L;
        
        public GetEntityListCallable(String entityCode, Long itemId) {
            this. entityCode = entityCode;
            this.itemId = itemId;
        }
        public Map<String, String> call() throws Exception {
            Map<String, String> entityMap = null;
            try {
                entityMap = QueryServiceImpl.this.getEntity(entityCode, itemId);//先去hbase查基本信息

            } catch (Exception e) {
                entityMap = null;
            }
            return entityMap;
        }
    }
复制代码
        通过线程池的使用,可以减少创建,销毁进程所带来的系统开销,而且线程池中的工作线程可以重复使用,极大地利用现有系统资源,增加了系统吞吐量。
另外,今天也尝试了另一种合并Solr索引的方法,直接通过底层的Lucene的API进行,而不是提交Http请求,具体方法如下:

java -cp lucene-core-3.4.0.jar:lucene-misc-3.4.0.jar org/apache/lucene/misc/IndexMergeTool ./newindex ./app1/solr/data/index ./app2/solr/data/index 


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2011/12/29/2306775.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
8天前
|
SQL 运维 监控
MSSQL性能调优深度解析:索引精细调整、SQL查询优化与并发控制策略
在Microsoft SQL Server(MSSQL)的运维实践中,性能调优是确保数据库高效、稳定运行的核心任务
|
8天前
|
SQL 运维 数据库
MSSQL性能调优实战:索引策略优化、SQL查询精细调整与并发管理
在Microsoft SQL Server(MSSQL)的运维与优化过程中,性能调优是确保数据库高效运行的关键环节
|
9月前
|
数据采集 存储 缓存
【如何提高数据采集和分析的性能】如何优化数据查询、数据分区和数据压缩方面的处理
【如何提高数据采集和分析的性能】如何优化数据查询、数据分区和数据压缩方面的处理
|
11月前
|
数据库 索引
数据库查询条件优化方案
数据库查询条件优化方案
|
存储 Oracle JavaScript
300万数据导入导出优化方案,从80s优化到8s(实测)
300万数据导入导出优化方案,从80s优化到8s(实测)
300万数据导入导出优化方案,从80s优化到8s(实测)
|
SQL 存储 关系型数据库
提升SQL查询性能:深入理解和策略实践
1. 使用索引   索引是一个用于快速查询和检索数据的数据库结构。你可以将其想象成一本书的目录,它可以让数据库引擎不必扫描整个表,而是直接定位到所需的数据,从而大大提高查询的性能。以下是几种索引类型:
148 0
|
JavaScript 前端开发 API
【项目数据优化三】长列表数据优化
【项目数据优化三】长列表数据优化
104 0
|
SQL 存储 并行计算
20并行查询
20并行查询
148 0
|
SQL 缓存 数据库
理论:第三章:索引使用的限制条件,sql优化有哪些,数据同步问题(缓存和数据库),缓存优化
理论:第三章:索引使用的限制条件,sql优化有哪些,数据同步问题(缓存和数据库),缓存优化
110 0