struts 1.x
除非强制进入 session ,否则我总是使用scope="request"定义struts表单 Action 映射。一个例子:
<action
path="/hello/my/oldfriend"
type="com.imFine.HowAreYouAction"
name="greetingActionForm"
scope="request"
validate="true"
input="/the/front/door">
<forward
name="success"
path="/go/get/drinks.do" />
</action>
如果我将此操作映射从请求范围转换为 session 范围,那么我几乎总是会看到性能下降。对 struts servlet 的哪些额外方法调用会导致 session 范围表单 bean 的额外工作负载?
最佳答案
当 request
作用域或 session
作用域时,ActionForm 的处理方式确实存在差异。
对于请求范围,当用户提交 HTML 表单时,Struts 实例化您的 ActionForm,将请求参数绑定(bind)到其上,然后使用 request.setAttribute(...)
将其放入请求范围中供 View 使用。一旦请求被处理,ActionForm 就会消失(垃圾收集的主题),因为请求的所有数据现在都超出了范围。每个新请求都会导致 ActionForm 被创建、使用和销毁。
对于 session 范围,当用户提交表单时,Struts 尝试在 session 中查找 ActionForm。如果找到,它就会使用它并将请求参数绑定(bind)到它上面。如果没有找到,它会创建一个并使用 session.setAttribute(...)
将其放入 session 中。一旦请求被处理,ActionForm 就会保留在 session 中,并且对于进一步的请求,它会被重用。
上述不应导致显着的性能开销。
session 是指应用程序的每个用户在服务器上的数据。这些数据意味着内存。更多用户意味着更多内存。当用户数据超出内存处理能力时,服务器通常会将这些数据移动到持久存储上。 session 数据在不需要时在磁盘上序列化,然后在再次需要时反序列化(数据库是数据的另一种存储类型)。
也许这就是发生的事情。内存不足,服务器将其存储/恢复到磁盘上,导致 IO 操作比内存访问慢。
Struts 如何根据指定的范围处理表单可能是一个转移注意力的话题。首先检查您的 session 。
关于performance - struts 1.x 表单作用域,为什么请求作用域更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795757/