当他们说struts框架中的动作控制器是多线程的时,这是否意味着有多个servlet实例接受请求并将其转发给模型。或者这是否意味着只有一个实例接受所有请求?任何视觉效果将不胜感激
3 回答
与大多数其他 servlet 一样,会创建一个单独的线程来处理每个请求。您必须实现该SingleThreadedModel
接口才能为每个请求获取一个新的 servlet 实例。
见http://struts.apache.org/1.x/userGuide/building_controller.html
Struts 控制器 servlet 只创建 Action 类的一个实例,并使用这个实例来服务所有请求。因此,您需要编写线程安全的 Action 类。遵循与编写线程安全 Servlet 相同的准则。以下是两个通用指南,可帮助您编写可扩展的、线程安全的 Action 类:
仅使用局部变量- 有助于线程安全编码的最重要原则是在 Action 类中仅使用局部变量,而不是实例变量。局部变量是在(由您的 JVM)分配给每个请求线程的堆栈上创建的,因此无需担心共享它们。只要需要的所有变量都作为方法参数传递,Action 可以分解为多个本地方法。这确保了线程安全,因为 JVM 使用与单个线程关联的调用堆栈在内部处理这些变量。
节省资源- 作为一般规则,分配稀缺资源并将它们保留在来自同一用户的请求(在用户的会话中)可能会导致可伸缩性问题。例如,如果您的应用程序使用 JDBC,并且您为每个用户分配一个单独的 JDBC 连接,那么当您的站点突然出现在 Slashdot 上时,您可能会遇到一些可伸缩性问题。在将控制权转发给适当的 View 组件之前,您应该努力使用池并释放资源(例如数据库连接)——即使您调用的 bean 方法引发了异常。
struts 1 不是线程安全的;但对于 strus 2,它是每个请求一个实例。