Tomcat 6 下的 Servlet 101:
有人可以向我指出一个很好的解释,例如最好的方法。在 servlet 启动时创建一个昂贵的 Foo 对象的集合,并将它们存储在我可以在处理每个请求时访问它们的地方?
据我所知,至少有三种方法可以做到这一点,我对区别有点模糊。我不关心集群或算法来驱逐过时的条目或类似的东西,只是基础知识。
干杯和感谢。
实现a 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 个对象的情况,不必将其添加到空闲对象列表中可以节省很多。如果引用没有null
将下一个释放的对象添加到列表中,则在分配时返回最后一个释放的对象和null
它。
您可以使用servlet 上下文。
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...
}
这是一个链接,您可以在其中阅读更多信息