2 回答
TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個贊
高級客戶端已經(jīng)為您維護(hù)了一個連接池,所以我會將它用作單例。不斷創(chuàng)建和關(guān)閉連接池的成本很高,而且客戶端和底層 HTTP 連接池都是線程安全的。此外,對客戶端的調(diào)用close()只是委托給 Apache HTTP 客戶端shutdown()方法,因此您將受制于它們?nèi)绾翁幚砬謇砗歪尫刨Y源。
如果您使用 Spring 或其他一些 DI 框架,則可以輕松創(chuàng)建可以根據(jù)需要注入的客戶端單例實(shí)例。您可以將調(diào)用添加client.close()為 bean 關(guān)閉/銷毀生命周期階段的一部分。
使用 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 被銷毀時為您調(diào)用它。其他框架可能要求您指定應(yīng)如何處理關(guān)閉。
TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個贊
RestHighLevelClient通常應(yīng)該是單例的,除非你有充分的理由。例如,如果您的作業(yè)每小時而不是一分鐘運(yùn)行,那么創(chuàng)建新實(shí)例并在作業(yè)后關(guān)閉它可能是有意義的。
如果您確定close()在所有情況下都在調(diào)用(例如,您沒有錯過任何異常),那么我的下一個猜測是彈性客戶端中的錯誤。
看起來他們忘記在 exists 調(diào)用中使用響應(yīng): https ://github.com/elastic/elasticsearch/blob/v6.4.0/client/rest-high-level/src/main/java/org/elasticsearch /client/RestHighLevelClient.java#L1419
你能在沒有exists電話的情況下進(jìn)行測試嗎?
添加回答
舉報
