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
電話的情況下進行測試嗎?
添加回答
舉報