2014-09-18 119 views
0

這是一個結構問題(最佳實踐是什麼)。Java Elasticsearch客戶端結構

我有一個域名站點的50個Servlet,我管理的地方是客戶端讓js調用到java Servlet,然後調用ElasticSearch,然後servlet響應客戶端。

在我的每個servlet中,類名後立即爲ES連接創建一個靜態設置和客戶端配置。這是因爲在每個servlet中可能有2個或多個方法調用相同的ES羣集,我不想在每種方法中創建此配置。

/** 
* Servlet implementation class Results 
*/ 
@WebServlet("/Results") 
public class Results extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elastictest").build(); 
    Client client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress("143.79.236.xxx", 9300)); 

但是現在我想知道我應該做50次(每個類的頂部配置1個配置)嗎?或者,我是否使用相同的配置創建一個新的java類,並在每個servlet引用中創建一個新的java類?這是否可以節省內存和更好的練習?

**--Inside name.java --** 

public static Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elastictest").build(); 
public static Client client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress("143.79.236.xxx", 9300)); 

--Inside在50個servlet的所有方法引用name.client instead--

SearchResponse response = name.client.prepareSearch().setQuery(...... 

而且,在我的doPost的底部(我發出了printWriter.println(結果後))我要關閉客戶嗎? client.close();

謝謝。

回答

1

我不會將這些對象存儲在類作用域中。我認爲最好只在doPost開始時打開客戶端連接,最後關閉它。通過這種方式,內存和網絡資源僅在必要時纔會被採用,而且您不必關心保持連接是否存活,從而使數據保持良好狀態。除此之外,如果你想避免在你的所有類中重複代碼,只需創建一個新的類(一種「助手」或「委託」,或任何你喜歡的名字),它包含一個方法連接作業,並返回客戶端。再次,沒有任何班級成員,只是方法中的一切。

更一般地,如果你想要更多的理論,我建議您閱讀有關無國籍編程 Advantages of stateless programming?

+0

這使得有很大的意義,我從來沒有想過。謝謝!^1 – Chris 2014-09-18 19:52:29