Elasticsearch Java Client连接池

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

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

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

复制代码
 1 import java.io.IOException;
 2 import java.net.InetSocketAddress;
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 import java.util.concurrent.ConcurrentHashMap;
 8 
 9 import org.elasticsearch.client.Client;
10 import org.elasticsearch.common.settings.Settings;
11 import org.elasticsearch.common.transport.InetSocketTransportAddress;
12 import org.elasticsearch.common.xcontent.XContentBuilder;
13 import org.elasticsearch.common.xcontent.XContentFactory;
14 import org.elasticsearch.index.mapper.Mapping;
15 import org.elasticsearch.transport.client.PreBuiltTransportClient;
16 
17 import com.chinadigitalvideo.esagent.servlet.WebServiceInit;
18 
19 /**
20  * Created by tgg on 16-3-17.
21  */
22 public class ClientHelper {
23     private static String ip;
24     private static int port;
25 
26     private Settings setting;
27     private Mapping mapping;
28     
29     private Map<String, Client> clientMap = new ConcurrentHashMap<String, Client>();
30 
31     private Map<String, Integer> ips = new HashMap<String, Integer>(); // hostname port
32 
33     private String clusterName = WebServiceInit.clusterName;
34 
35     private ClientHelper(String ip,Integer port) {
36         init(ip,port);
37         //TO-DO 添加你需要的client到helper
38     }
39 
40     public static final ClientHelper getInstance(String ipConf ,Integer portConf) {
41         ip=ipConf;
42         port=portConf;
43         return ClientHolder.INSTANCE;
44     }
45 
46     private static class ClientHolder {
47         private static final ClientHelper INSTANCE = new ClientHelper(ip,port);
48     }
49 
50     /**
51      * 初始化默认的client
52      */
53     public void init(String ip,int port) {
54         
55         ips.put(ip, port);
56         setting =Settings.builder()
57                 .put("client.transport.sniff",true)
58                 .put("cluster.name",clusterName).build();
59         addClient(setting, getAllAddress(ips));
60     }
61 
62     /**
63      * 获得所有的地址端口
64      *
65      * @return
66      */
67     public List<InetSocketTransportAddress> getAllAddress(Map<String, Integer> ips) {
68         List<InetSocketTransportAddress> addressList = new ArrayList<InetSocketTransportAddress>();
69         for (String ip : ips.keySet()) {
70             addressList.add(new InetSocketTransportAddress(new InetSocketAddress(ip, ips.get(ip))));
71         }
72         return addressList;
73     }
74 
75     public Client getClient() {
76         return getClient(clusterName);
77     }
78 
79     public Client getClient(String clusterName) {
80         return clientMap.get(clusterName);//通过集群名称得到一个Client
81     }
82 
83     public void addClient(Settings setting, List<InetSocketTransportAddress> transportAddress) {
84         Client client = new PreBuiltTransportClient(setting)
85                 .addTransportAddresses(transportAddress.toArray(new InetSocketTransportAddress[transportAddress.size()]));
86         
87         clientMap.put(setting.get("cluster.name"), client);
88     }
89 }
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6710081.html,如需转载请自行联系原作者

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
4月前
|
JSON 自然语言处理 Java
Java原生操作Elasticsearch
Java原生操作Elasticsearch
36 0
|
5月前
|
数据采集 网络协议 Java
Java爬虫框架下代理使用中的TCP连接池问题及解决方案
Java爬虫框架下代理使用中的TCP连接池问题及解决方案
|
2天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
27 3
|
14天前
|
Java Maven 索引
java 链接Elasticsearch
java 链接Elasticsearch
|
27天前
|
Java
elasticsearch使用java程序添加删除修改
elasticsearch使用java程序添加删除修改
9 0
|
6月前
|
Java 微服务
【Java异常】com.netflix.client.ClientException: Load balancer does not have available server for client
【Java异常】com.netflix.client.ClientException: Load balancer does not have available server for client
119 0
|
3月前
|
Java
elasticsearch在Java中查询指定列的方法
elasticsearch在Java中查询指定列的方法
84 0
|
4月前
|
SQL Java 数据库连接
Could not open client transport with JDBC Uri: jdbc:hive2://192.168.88.10:10000: java.net.ConnectExc
Could not open client transport with JDBC Uri: jdbc:hive2://192.168.88.10:10000: java.net.ConnectExc
96 0
|
4月前
|
NoSQL Java API
SpringBoot【ElasticSearch集成 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(依赖+配置+增删改查测试源码)推荐使用
SpringBoot【ElasticSearch集成 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(依赖+配置+增删改查测试源码)推荐使用
57 0
|
4月前
|
关系型数据库 MySQL Java
Elasticsearch【问题记录 01】启动&停止服务的2类方法及 java.nio.file.AccessDeniedException: xx/pid 问题解决(含启停shell脚本)
Elasticsearch【问题记录 01】启动&停止服务的2类方法及 java.nio.file.AccessDeniedException: xx/pid 问题解决(含启停shell脚本)
71 0

热门文章

最新文章