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

简介:
  客户调用批量查询接口对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,如需转载请自行联系原作者

目录
相关文章
IDEA常用插件之翻译插件
IDEA常用插件之翻译插件
520 2
|
存储 监控 文件存储
存储之外,还有什么?云计算对象存储服务OSS深度洞察
存储之外,还有什么?云计算对象存储服务OSS深度洞察
1049 0
|
消息中间件 Java
RabbitMQ消费者并发数设置
RabbitMQ消费者并发数设置
RabbitMQ消费者并发数设置
|
Web App开发 前端开发 JavaScript
VSCode如何设置Vue前端的debug调试
VSCode如何设置Vue前端的debug调试
1126 0
|
12月前
|
JSON 数据可视化 JavaScript
低代码可视化-uniapp响应式数据data-代码生成器
低代码可视化-uniapp响应式数据data-代码生成器
175 0
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
Oracle 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(五十一)(3)
SqlAlchemy 2.0 中文文档(五十一)
252 1
|
存储 弹性计算 监控
【阿里云弹性计算】深入阿里云ECS配置选择:CPU、内存与存储的最优搭配策略
【5月更文挑战第20天】阿里云ECS提供多种实例类型满足不同需求,如通用型、计算型、内存型等。选择CPU时,通用应用可选1-2核,计算密集型应用推荐4核以上。内存选择要考虑应用类型,内存密集型至少4GB起。存储方面,系统盘和数据盘容量依据应用和数据量决定,高性能应用可选SSD或高效云盘。结合业务特点和预算制定配置方案,并通过监控应用性能适时调整,确保资源最优利用。示例代码展示了使用阿里云CLI创建ECS实例的过程。
497 5
|
人工智能 自然语言处理 安全
如何通过网关降低大模型的调用费用,并提升合规性
如何通过网关降低大模型的调用费用,并提升合规性
908 100
Java处理正则表达式特殊字符转义
正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|' 异常现象: java.util.regex.PatternSyntaxException: Dangling meta. character '*' near index 0 解决方法: 对特殊字符加\\转义即可。
5694 0