Elasticsearch线程池

Elasticsearch在实际的开发使用中发现,如果每次使用都建立一次连接,那么对系统资源的消耗是巨大的,严重影响程序的性能,那么针对这种情况,我们自己实现一种线程池的,在使用时建立一次连接,然后将连接放入map中,每次使用中从map获取该连接。

具体代码如下:

/**
 * @author Shuyu.Wang
 * @package:com.ganinfo.utils
 * @className:
 * @description:ES连接池
 * @date 2018-04-18 11:26
 **/
@Component
@RefreshScope
@Slf4j
public class ClientHelper {
    @Value("${spring.data.elasticsearch.ip}")
    private String host; // 服务器地址
    @Value("${spring.data.elasticsearch.port}")
    private int port; // 端口
    @Value("${spring.data.elasticsearch.clustername}")
    private String clusterName;

    private Settings setting;

    private ConcurrentHashMap<String, TransportClient> clientMap = new ConcurrentHashMap<String, TransportClient>();

    private Map<String, Integer> ips = new HashMap<String, Integer>(); // hostname port

    public static final ClientHelper getInstance() {
        return ClientHolder.INSTANCE;
    }

    private static class ClientHolder {
        private static final ClientHelper INSTANCE = new ClientHelper();
    }

    /**
     * 初始化默认的client
     */
    public void init() {
        log.info("host:" + host);
        log.info("clusterName:" + clusterName);
        if (host.contains(",")) {
            String[] split = host.split(",");
            for (String ip : split) {
                ips.put(ip, port);
            }
        } else {
            ips.put(host, port);
        }
        setting = Settings.builder().put("cluster.name", clusterName)
                .put("client.transport.sniff", true)
                .put("thread_pool.search.size", 10)
                .put("thread_pool.search.queue_size", 500)
                .build();
        addClient(setting, ips);
    }

  

    public TransportClient getClient() {
        return getClient(clusterName);
    }

    public TransportClient getClient(String clusterName) {
        if (CommonUtil.isNotMapNull(clientMap)) {
            return clientMap.get(clusterName);
        } else {
            init();
        }
        return clientMap.get(clusterName);
    }

    public void addClient(Settings setting, Map<String, Integer> ips) {
        TransportClient client = new PreBuiltTransportClient(setting);

        for (String ip : ips.keySet()) {
            try {
                client = client.addTransportAddresses(new InetSocketTransportAddress(InetAddress.getByName(ip), Integer.valueOf(ips.get(ip).toString())));
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
        if (client != null) {
            clientMap.put(setting.get("cluster.name"), client);
        } else {
            log.error("TransportClient is null ,can not build cennection for es");
        }

    }


}

使用:

    @Autowired
    private ClientHelper clientHelper;





 @Override
    public ESReturn<List<Map<String, Object>>> query(String index, String type, QueryBuilder queryBuilder, String sort, Integer from, Integer size) {
        ESReturn<List<Map<String, Object>>> esReturn = new ESReturn<List<Map<String, Object>>>();
        TransportClient client = clientHelper.getClient();
        SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type);
        SearchResponse sr = srb.setQuery(queryBuilder).setFrom(from).setSize(size).addSort(SortBuilders.fieldSort(sort).unmappedType("integer").order(SortOrder.DESC)).execute().actionGet(); // 分页排序所有
        long totalHits = sr.getHits().totalHits();
        esReturn.setTotal(totalHits);
        SearchHits hits = sr.getHits();
        List<Map<String, Object>> result = new ArrayList<>();
        for (SearchHit hit : hits) {
            Map<String, Object> map = (Map<String, Object>) hit.getSource();
            result.add(map);
        }
//        log.info("返回结果:" + totalHits + "条数据");
        esReturn.setData(result);
        return esReturn;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值