1.Struts 2管理Action (开发者不用担心Action的线程安全)
Struts2的 Action 对象为每一个请求产生一个实例,都会创建一个对象,相互独立的;因此,即使在Action中定义了很多全局变量,也不存在线程安全问题。
Struts 2框架在处理每一个用户请求的时候,都建立一个单独的线程进行处理,值栈ValueStack也是伴随着局部线程而存在的。在该线程存在过程中,可以随意访问值栈,这就保证了值栈的安全性。
在Struts 2中,对于每个请求,struts2都会创建一个actionContext(action上下文)是一个局部线程,这就意味着每个线程中的ActionContext内容都是唯一的。
2.使用spring管理struts2的action实例对象
当使用spring管理struts2的action实例对象scope必须配置为prototype或者session,
若配置为singleton则多线程访问时会出现问题,例如actionMessage,fieldError等信息会累加,多用户访问时有的用户访问到的是另一个用户的数据。
scope=“prototype”是为每个请求提供一个action实例(与struts2的机制是一样的)
scope=“session”是为每个会话提供一个action实例。
通常使用prototype,即让spring容器为每个请求提供一个action实例,好处是服务器端不用维护用户状态信息,否则使用session服务器端必须存储状态信息,用户多时占用服务器端内存过多。使用prototype时,必须自己在客户端维护用户的状态,每次访问服务端时将相应状态信息提交给服务器。
3.如果在struts的Action 中使用信号量控制并发的请求个数,要注意action会共享信号量的数字;(生产经验总结)
建议对struts2的action类的每个方法设置单独的信号量
private static final Semaphore semaphore = new Semaphore(100);
public void function() {
semaphore.tryAcquire();
semaphore.release();
}
private static final Semaphore semaphore1 = new Semaphore(100);
public void function1() {
semaphore1.tryAcquire();
semaphore1.release();
}