2 回答
TA贡献1821条经验 获得超6个赞
高级客户端已经为您维护了一个连接池,所以我会将它用作单例。不断创建和关闭连接池的成本很高,而且客户端和底层 HTTP 连接池都是线程安全的。此外,对客户端的调用close()只是委托给 Apache HTTP 客户端shutdown()方法,因此您将受制于它们如何处理清理和释放资源。
如果您使用 Spring 或其他一些 DI 框架,则可以轻松创建可以根据需要注入的客户端单例实例。您可以将调用添加client.close()为 bean 关闭/销毁生命周期阶段的一部分。
使用 Spring Boot 的快速示例:
@Configuration
@ConditionalOnClass(RestHighLevelClient.class)
public class ElasticSearchConfiguration {
@Value("${elasticsearch.address}")
String address;
@Value("${elasticsearch.port}")
int port;
@Bean(destroyMethod = "close")
public RestHighLevelClient restHighLevelClient() {
return new RestHighLevelClient(
RestClient.builder(new HttpHost(address, port, "http")));
}
}
注意:在这种情况下,Spring 会自动检测 bean 有一个close方法,并在 bean 被销毁时为您调用它。其他框架可能要求您指定应如何处理关闭。
TA贡献1847条经验 获得超11个赞
RestHighLevelClient
通常应该是单例的,除非你有充分的理由。例如,如果您的作业每小时而不是一分钟运行,那么创建新实例并在作业后关闭它可能是有意义的。
如果您确定close()
在所有情况下都在调用(例如,您没有错过任何异常),那么我的下一个猜测是弹性客户端中的错误。
看起来他们忘记在 exists 调用中使用响应: https ://github.com/elastic/elasticsearch/blob/v6.4.0/client/rest-high-level/src/main/java/org/elasticsearch /client/RestHighLevelClient.java#L1419
你能在没有exists
电话的情况下进行测试吗?
添加回答
举报