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

    客户调用批量查询接口对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 


转自:http://www.cnblogs.com/phinecos/archive/2011/12/29/2306775
2019-03-27 01:05

知识点

相关教程

更多

如何大幅优化solr的查询性能(转)

提升软件性能,通常喜欢去调整各种启动参数,这没有多大意义,小伎俩。 性能优化要从架构和策略入手,才有可能得到较大的收益 Solr的查询是基于Field的,以Field为基本单元,例如一个文章站要索引   classArticle {  String title;  String content;  String tags; }   查询参数: q=title:big && cont

mysql数据库千万级别数据的查询优化和分页测试

原文地址:原创 mysql数据库千万级别数据的查询优化和分页测试作者:于堡舰 本文为本人最近利用几个小时才分析总结出的原创文章,希望大家转载,但是要注明出处 http://blog.sina.com.cn/s/blog_438308750100im0b.html 有什么问题:yubaojian0616@163.com 于堡舰 我原来的公司是一家网络游戏公司,其中网站交易与游戏数据库结合通过ws实现

SQL优化问题

select * from 表 where 表字段 in(); in后面是一个大的集合,里面大概有200个选项,这些选项是通过一个java List对象传过来的,因此无法使用exsits,大家有什么好的优化办法没有?

solr-dataimportHandler之批量索引

本文主要讨论solr中的dataImportHandler机制,对这个不熟的朋友,可以先看下。solr wiki中的dataimporthandler这篇文章,笔者也对dataimporthandler进行了一些翻译,不过效果不是很好,有兴趣的朋友也可以参考一下。http://mxsfengg.blog.163.com/blog/static/26370218200810250524813/。 想

solr-dataimportHandler之批量索引

http://mxsfengg.iteye.com/blog/277913   本文主要讨论solr中的dataImportHandler机制,对这个不熟的朋友,可以先看下。solr wiki中的dataimporthandler这篇文章,笔者也对dataimporthandler进行了一些翻译,不过效果不是很好,有兴趣的朋友也可以参考一下。http://mxsfengg.blog.163.com

HBase在淘宝的应用和优化小结

HBase在淘宝的应用和优化小结    作者:nosqlfan on 星期一, 三月 5, 2012 · 3条评论【阅读:8,733 次】 本文来自于NoSQLFan联合作者@koven2049,他在淘宝从事Hadoop及HBase相关的应用和优化。对Hadoop、HBase都有深入的了解,本文就是其在工作中对HBase的应用优化小结,分享给大家。 原文地址:http://walko

jsp、struts1和hibernate如何实现批量更新数据

如题,比如说从一个表里查出来十行数据,每行数据都做了更改,如何一起提交到后台,后台如何接收并更新,大家工作中正用到的方法。  谢谢!     问题补充:请问有具体的实例吗?谢谢!     jkxydp 写道      这个用ajax最好不过了,把进行更改过的十几条数据构造成json格式的数据发送给后台,后台接收到数据之后放入一个链表最好是Vector里面,然后调用service存入数据库,最好放到

一次内存泄露问题的排查

系统对外提供的Solr查询接口,在来自外部调用的压力加大之后,就会出现solr查询报Read Timed Out的异常,从表面现象上看是此时solr核压力过大,无法响应过多的查询请求。    但实际上此时并发查询压力并不是很大,那么为何solr核会无法及时响应查询请求呢?首先用top查看了下load average,也是很低,也佐证了系统本身压力并不大。  然后,用jstack –l <pi

solr4.1 DataImport MYSQL批量导入

solrconfig.xml 添加:  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults">  <str name="

文本文件批量操作类(php)

不完善,现在来说。但是改不多了。我以前用asp写过,但是没有写成类。这次从qs文学网下了很多。就写了这个类,from asia-storm。         <   TEXTAREANAME   =   "   info   "   ROWS   =   "   1   "   COLS   =   "   80   "   >

一次病毒分析之旅

From :http://bbs.pediy.com/showthread.php?t=150131                                                   标 题: 【原创】一次病毒分析之旅 作 者: yuansunxue 时 间: 2012-05-02,23:42:19 链 接: http://bbs.pediy.com/showthread.php

查询的时候事物的问题

比如说我有二张表,学生表,老师表 (2张表没关系)  1.如果我单独查询一次学生表,需要放在一个事物里吗?  2.如果我查询学生表,又查询老师表,有没必要放在同一个事物里?

HBase 在淘宝的应用和优化

本文来自于NoSQLFan联合作者@koven2049,他在淘宝从事Hadoop及HBase相关的应用和优化。对Hadoop、HBase都有深入的了解,本文就是其在工作中对HBase的应用优化小结,分享给大家。 前言   hbase是从 hadoop中分离出来的apache顶级开源项目。由于它很好地用java实现了google的bigtable系统大部分特性,因此在数据量猛增的今天非常受到欢迎。对

Oracle优化配置指南(4)-Oracle的优化器

Oracle的优化器有两种优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO),在Oracle8及以后的版本,Oracle强列推荐用CBO的方式。

HBase 在淘宝的应用和优化

本文来自于  NoSQLFan联合作者  @koven2049,他在淘宝从事Hadoop及HBase相关的应用和优化。对Hadoop、HBase都有深入的了解,本文就是其在工作中对HBase的应用优化小结,分享给大家。    目 录[ - ]     前言 原因 应用情况 部署、运维和监控 测试与发布 改进和优化 将来计划   前言   hbase是从 hadoop中分离出来的apache顶级开源

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案