一次针对批量查询处理的优化
客户调用批量查询接口对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;
}
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;
}
}
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实现方案