按照Elasticsearch API,在Java端使用是ES服务需要创建Java Client,但是每一次连接都实例化一个client,对系统的消耗很大,即使在使用完毕之后将client close掉,由于服务器不能及时回收socket资源,极端情况下会导致服务器达到最大连接数。

为了解决上述问题并提高client利用率,可以参考使用池化技术复用client。

 import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.mapper.Mapping;
import org.elasticsearch.transport.client.PreBuiltTransportClient; import com.chinadigitalvideo.esagent.servlet.WebServiceInit; /**
* Created by tgg on 16-3-17.
*/
public class ClientHelper {
private static String ip;
private static int port; private Settings setting;
private Mapping mapping; private Map<String, Client> clientMap = new ConcurrentHashMap<String, Client>(); private Map<String, Integer> ips = new HashMap<String, Integer>(); // hostname port private String clusterName = WebServiceInit.clusterName; private ClientHelper(String ip,Integer port) {
init(ip,port);
//TO-DO 添加你需要的client到helper
} public static final ClientHelper getInstance(String ipConf ,Integer portConf) {
ip=ipConf;
port=portConf;
return ClientHolder.INSTANCE;
} private static class ClientHolder {
private static final ClientHelper INSTANCE = new ClientHelper(ip,port);
} /**
* 初始化默认的client
*/
public void init(String ip,int port) { ips.put(ip, port);
setting =Settings.builder()
.put("client.transport.sniff",true)
.put("cluster.name",clusterName).build();
addClient(setting, getAllAddress(ips));
} /**
* 获得所有的地址端口
*
* @return
*/
public List<InetSocketTransportAddress> getAllAddress(Map<String, Integer> ips) {
List<InetSocketTransportAddress> addressList = new ArrayList<InetSocketTransportAddress>();
for (String ip : ips.keySet()) {
addressList.add(new InetSocketTransportAddress(new InetSocketAddress(ip, ips.get(ip))));
}
return addressList;
} public Client getClient() {
return getClient(clusterName);
} public Client getClient(String clusterName) {
return clientMap.get(clusterName);//通过集群名称得到一个Client
} public void addClient(Settings setting, List<InetSocketTransportAddress> transportAddress) {
Client client = new PreBuiltTransportClient(setting)
.addTransportAddresses(transportAddress.toArray(new InetSocketTransportAddress[transportAddress.size()])); clientMap.put(setting.get("cluster.name"), client);
}
}

Elasticsearch Java Client连接池的更多相关文章

  1. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  2. Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介.Java REST Client.Java Client.Spri ...

  3. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  4. MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物

    dbcp下载 传送门 Commons Pool下载 传送门 Commons log下载 传送门 MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_( ...

  5. MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池

    MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...

  6. Redis c/c++, java client连接

    Redis 介绍 redis这个想必大家都了解,关于redis的安装參考这里,redis使用文档參见这里,英文文档. Redis Cclient的用法 Redis的cclient Hiredis使用比 ...

  7. elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...

  8. elasticsearch Java Client用户指南

    这里使用的Java客户端版本是5.1.2,Elasticsearch的版本号也要是5.1.2,否则一些功能可能不支持. 之前介绍过Spring Data Elasticsearch,那里也是使用了本文 ...

  9. Java c3p0连接池

    import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; i ...

随机推荐

  1. Object.create() 创建实例对象

    var person1 = { name: '张三', age: 38, greeting: function() { console.log('Hi! I\'m ' + this.name + '. ...

  2. java中的标识符、关键字、保留字

    Java中关键字(keyword)和保留字(reservedword) Keyword :Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等. Reserv ...

  3. 调试问题集之——Max10中配置完成后程序不能运行

    CONF_DONE信号是一个双向信号并且是Open-Drain.在配置过程中和配置之前作为输出,且为低电平.配置完成之后CONF_DONE作为输入脚,因为Open-Drain,所以必须由外部拉高,但二 ...

  4. 冬瓜头答疑:磁盘阵列内部FC-AL的性能问题

    冬瓜头答疑:磁盘阵列内部FC-AL的性能问题 作者:冬瓜头出处:IT专家网2009-08-03 09:59   问: 大多数磁盘阵列都是通过两个控制器后端的端口,组成1/2/4条FC-AL环,来连接所 ...

  5. noip2017d2t2

    看数据范围想到状压,我们知道最后是选出一颗生成树,但边权的计算有一些有趣: 我们先选一个点做根:然后就发现边的权和深度有关:那我们按深度dp;即按层dp; dp[i][s]表示前i层选的点集为s,转移 ...

  6. Async Return Types

    Async methods have three possible return types: Task<TResult>, Task, and void. The Task<TRe ...

  7. spring mvc使用ModelAndView时发生No request handling method with name '方法 名' in class [类名]的错误

    我日,下午关于标题错误查了好久,网上啥说法都有, 后来发现是ModelAndView的路径引错了 正确路径应该为: import org.springframework.web.servlet.Mod ...

  8. POJ1195--Mobile phones(基础二维BIT)

    Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...

  9. ZUFE2481 神奇的字符串 2017-05-12 16:41 39人阅读 评论(0) 收藏

    2481: 神奇的字符串 时间限制: 3 Sec  内存限制: 256 MB 提交: 8  解决: 3 [提交][状态][讨论版] 题目描述 输入 输出 样例输入 abcb 1000 1100 350 ...

  10. Scala_基本语法

    基本语法 声明值和变量 Scala有两种类型的变量: val:是不可变的(变量的引用不可变),在声明时就必须被初始化,而且初始化以后就不能再赋值: var:声明的时候需要进行初始化,初始化以还可以再对 ...