Java Servlet池

时间:2009-11-18 12:42:06

标签: java servlets pooling

在Tomcat 6下的Servlets 101:

有人可以指点我对例如最佳方式的一个很好的解释。在servlet启动时创建一个昂贵的Foo对象的集合,并将它们存放在我可以在处理每个请求时访问它们的地方?

我可以说至少有三种方法可以做到这一点,我对这种差异有点模糊。我并不关心集群或算法来驱逐陈旧的条目或类似的东西,只是基础知识。

干杯谢谢。

4 个答案:

答案 0 :(得分: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>

以下是在常规servlet中访问它的方法:

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池”有什么关系。这个词毫无意义。

希望这有帮助。

答案 1 :(得分:1)

您有几种选择:

  • 使用commons-pool,在启动时启动对象,然后从池中借用它们。
  • 确保您确实需要一个对象池。在许多情况下,您只需创建一个对象并以线程安全的方式访问它。值得一看的地方是spring framework

答案 2 :(得分:0)

您正在寻找一个对象池。通常,使用可用对象列表构建对象池,在释放资源时添加到列表中,同时未达到最大可用对象数。

我不会提前填充池,只是在自由对象池为空时分配一个新对象。

一个值得注意的性能胜利是为最后一个释放的对象保留1个引用。不必将其添加到空闲对象列表中可以为分配和释放1个对象的情况节省很多。如果引用不是null,则将下一个释放的对象添加到列表中,在分配时返回最后一个释放的null

答案 3 :(得分: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