在我的 Controller servlet(Tomcat)中,我实例化了一个对象并将其分配给类的属性(p),如下所示:
public class Controller extends HttpServlet {
String xmlFile = "/tmp/page.xml";
private Pager p = new Pager(xmlFile);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
.............
我这样做的原因是,有很多 cpu 密集型因此耗时的任务由只需要完成一次的实例化完成(基本上它创建了应用程序的所有 html 页面结构)。
现在,我使用持久对象(p)并访问它的一些方法,如下所示:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
.................
.................
String name = "xxxxx";
Structure str = p.doAction(name);
..................
}
我的问题是,在 Tomcat 完成特定请求后,由getPageName()和doAction()等方法创建的对象、原语等是否会被清理?还是会继续使用内存(与 Pager 的持久对象p相同)直到 Tomcat 下一次重新启动/关闭?
另一个重要的问题是,由于 servlet 将处理多个请求,它使用的对象和原语是否会有任何问题(它们中的大多数是方法的本地变量,但其中一些变量使用类的属性)?像这样 :
public Structure doAction(String name) {
if ( pages.containsKey(name) ) {// Here pages is a property of this class (a HashMap)
return( new Structure( (Structure)pages.get(name) )); //this creates a "deep copy of this object and sends it back...
}
return( new Structure() );
}//
如上述方法所示,页面 HashMap 将采用以下形式:
page1 => its Structure Object,
page2 => its Structure Ojbect,
..... => .....................,
pageN => its Structure Object
因此,如果 Servlet 同时接收到许多请求,例如:比如说,在特定时间t有N个对page2的请求,那么从 doAction() 方法访问页面HashMap会不会有任何问题?(因为它是类的一个属性,所有这N个请求将同时访问它(只读,不写入)。我的意思是,会有“读锁”之类的吗?
提前致谢。