有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Servlet池

servlet 101,在Tomcat 6下:

有人能给我一个很好的解释,比如在servlet启动时创建一个昂贵的Foo对象集合,并将它们存放在我可以在处理每个请求时访问它们的地方吗

就我所知,至少有三种方法可以做到这一点,我对两者的区别有点模糊。我不关心集群或算法,以驱逐过时的条目或类似的东西,只是基本的

干杯,谢谢


共 (4) 个答案

  1. # 1 楼答案

    实现一个^{},在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池”有什么关系。这个术语毫无意义

    希望这有帮助

  2. # 2 楼答案

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

  3. # 3 楼答案

    您有几个选择:

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

    您正在查找对象池。通常,对象池是使用可用对象列表构建的,当资源被释放而未达到最大可用对象数量时,会添加到列表中

    我不会预先填充池,只要在空闲对象池为空时分配一个新对象即可

    一个显著的性能优势是为最后释放的对象保留1个引用。不必将其添加到自由对象列表中,在交替分配和释放1个对象的情况下,可以节省大量资源。如果引用不是null将下一个释放的对象添加到列表中,则在分配时返回最后一个释放的对象并null