Elasticsearch Java Client连接池
按照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连接池的更多相关文章
- Java Mysql连接池配置和案例分析--超时异常和处理
前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...
- 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 ...
- java自定义连接池
1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...
- MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物
dbcp下载 传送门 Commons Pool下载 传送门 Commons log下载 传送门 MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_( ...
- MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池
MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_(Java)[连接池]使用DBCP简单模拟银行转账事物 传送门 Java应用程序访问数据库的过程: ...
- Redis c/c++, java client连接
Redis 介绍 redis这个想必大家都了解,关于redis的安装參考这里,redis使用文档參见这里,英文文档. Redis Cclient的用法 Redis的cclient Hiredis使用比 ...
- 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 ...
- elasticsearch Java Client用户指南
这里使用的Java客户端版本是5.1.2,Elasticsearch的版本号也要是5.1.2,否则一些功能可能不支持. 之前介绍过Spring Data Elasticsearch,那里也是使用了本文 ...
- Java c3p0连接池
import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; i ...
随机推荐
- Java 获取最近时间
public static String getStatetime() throws ParseException{ SimpleDateFormat sdf = new SimpleDateForm ...
- Effective C++ 随笔(5)
条款27:尽量稍作转型动作 const_cast:常量性移除 dynamic_cast:安全向下转型 reinterpret_cast: static_cast: 如在子类当中享调用父类当中的某个方法 ...
- 基础运动move.js
/* * 事件绑定 */ function myAddEvent(obj,ev,fn){ if(obj.attachEvent){ obj.attachEvent('on' + ev,fn); }el ...
- 通过pip安装套件
pip3 install requests pip3 install BeautifulSoup4 还需要使用jupyter: pip3 install jupyter 打开jupyterbook ...
- vscode 调试node.js
在开发的过程中,几乎不可能一次性就能写出毫无破绽的程序,断点调试代码是一个普遍的需求. 作为前端开发工程师,以往我们开发的JavaScript程序都运行在浏览器端,利用Chrome提供的开发者工具就可 ...
- hdu 4961 数论?
http://acm.hdu.edu.cn/showproblem.php?pid=4961 给定ai数组; 构造bi, k=max(j | 0<j<i,a j%ai=0), bi=ak; ...
- RPC、RMI、SOAP、WSDL的区别详解
RPC与RMI的区别============================================================================RPC:(Remote Pr ...
- 关于TF卡的工作原理
首先关于TF卡的定义 其次是TF卡的卡槽 有4个数据传输端,D0,D1,D2,D3.有一个CMD脚,是用来读取卡内信息的,在刚插入TF时,主机会读取卡的内存大小,格式之类的. Sd脚是插入检测脚,当卡 ...
- 7.代理handler
简单的自定义opener() import urllib.request #构建一个HTTPHandler处理器对象,支持处理HTTP请求 http_handler=urllib.request.HT ...
- 9.js入门
1.Js介绍 ◆js是一款运行在客户端的网页编程语言. ◆组成部分 ★ecmascript js标准 ★dom 通过js操作网页元素 ★bom 通过api操作浏览器 ◆特点 ★简单易用 ★解释执行 ★ ...