2009-11-18 52 views
3

在Tomcat 6下的Servlets 101:Java Servlet池

有人能夠指出我對最好的方式的一個很好的解釋,例如。在servlet啓動時創建一個昂貴的Foo對象集合,並將它們存儲在可以在處理每個請求時訪問它們的地方?

附近,我可以告訴至少有三種方法可以做到這一點,我對這種差異有點模糊。我不關心集羣或算法來驅逐陳舊的條目或類似的東西,只是基本知識。

乾杯和謝謝。

+2

什麼是到目前爲止你已經找到了這三個方面? – OscarRyz 2009-11-18 12:46:59

+0

您沒有提及是否可以安全地從多個線程使用昂貴的對象。如果不是,你將有更少的選擇。 – 2015-08-26 04:55:03

回答

1

您有幾種選擇:

  • 使用commons-pool,開始在啓動你的對象,然後從池借用。
  • 確保您確實需要一個對象池。在許多情況下,您只能創建一個對象並以線程安全的方式訪問它。一個好地方是spring framework
6

實現一個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池」有什麼關係。這個詞是沒有道理的。

希望這會有所幫助。

+0

謝謝,,, contextInitialized接口方法和init()之間的主要區別是什麼?你能澄清更多嗎? – mebada 2010-03-02 15:58:37

0

您正在尋找一個對象池。通常情況下,使用免費對象列表構建對象池,在未達到最大可用對象數量時釋放資源時添加到列表中。

我不會填池前期,只是分配一個新的對象,如果有物體池是空的。

一個值得注意的性能勝利是爲最後釋放的對象保留1個引用。無需將其添加到自由對象列表中,可以節省大量空間,以便交替分配和釋放1個對象。如果引用不是null下一釋放對象添加到列表中,對分配返回最後釋放,null它。

0

可以使用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