在Tomcat 6下的Servlets 101:Java Servlet池
有人能夠指出我對最好的方式的一個很好的解釋,例如。在servlet啓動時創建一個昂貴的Foo對象集合,並將它們存儲在可以在處理每個請求時訪問它們的地方?
附近,我可以告訴至少有三種方法可以做到這一點,我對這種差異有點模糊。我不關心集羣或算法來驅逐陳舊的條目或類似的東西,只是基本知識。
乾杯和謝謝。
在Tomcat 6下的Servlets 101:Java Servlet池
有人能夠指出我對最好的方式的一個很好的解釋,例如。在servlet啓動時創建一個昂貴的Foo對象集合,並將它們存儲在可以在處理每個請求時訪問它們的地方?
附近,我可以告訴至少有三種方法可以做到這一點,我對這種差異有點模糊。我不關心集羣或算法來驅逐陳舊的條目或類似的東西,只是基本知識。
乾杯和謝謝。
您有幾種選擇:
實現一個ServletContextListener
,在contextInitialized()
做所需的裝載任務,並通過ServletContext#setAttribute()
結果在應用範圍上存儲。它將在服務器啓動期間被調用,並且應用程序範圍也可以在常規servlet中訪問。
基本例如:
public class Config implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
List<Foo> foos = fooDAO().list();
event.getServletContext().setAttribute("foos", foos);
}
}
地圖它web.xml
通常的方式:
<listener>
<listener-class>mypackage.Config</listener-class>
</listener>
以下是如何訪問它在標準的servlets:
protected void doSomething(request, response) {
List<Foo> foos = (List<Foo>) getServletContext().getAttribute("foos");
}
這裏是你如何能在JSP中訪問它:
<c:forEach items="${foos}" var="foo">
${foo.someProperty}<br>
</c:forEach>
這就是說,我真的不知道它與「servlet池」有什麼關係。這個詞是沒有道理的。
希望這會有所幫助。
謝謝,,, contextInitialized接口方法和init()之間的主要區別是什麼?你能澄清更多嗎? – mebada 2010-03-02 15:58:37
您正在尋找一個對象池。通常情況下,使用免費對象列表構建對象池,在未達到最大可用對象數量時釋放資源時添加到列表中。
我不會填池前期,只是分配一個新的對象,如果有物體池是空的。
一個值得注意的性能勝利是爲最後釋放的對象保留1個引用。無需將其添加到自由對象列表中,可以節省大量空間,以便交替分配和釋放1個對象。如果引用不是null
下一釋放對象添加到列表中,對分配返回最後釋放,null
它。
可以使用servlet context。
servlet上下文是通用於所有的servlet實例和其生命週期超出了請求和會話。
你可以把任何東西有一樣:
public void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletContext sc = getServletContext();
List expensiveObjectList = (List) sc.getAttribute("someName");
if(expensiveObjectList == null) {
expensiveObjectList = someExpensiveInitializationMethod();
sc.setAttribute("someName", expensiveObjectList);
}
// use the list...
}
這裏有一個鏈接,您可以閱讀更多about it
什麼是到目前爲止你已經找到了這三個方面? – OscarRyz 2009-11-18 12:46:59
您沒有提及是否可以安全地從多個線程使用昂貴的對象。如果不是,你將有更少的選擇。 – 2015-08-26 04:55:03