performance - struts 1.x 表单作用域,为什么请求作用域更快?

标签 performance forms scope struts

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/

相关文章:

java - 将操作传递给下一个按钮

c++ - 在一个简单的例子中解释并行代码执行和进一步的性能提升

mysql - 具有相同结果的两个 SQL 查询,但一个查询快一个数量级

html - 提交按钮在 IE 中有紫色边框,但在 Chrome 中没有。我如何在 IE 中摆脱它?

javascript - 表单提交后关闭 Bootstrap Modal - Rails

javascript - 与 JavaScript 匿名函数中的 "this"对象混淆

scala - 试图理解 Scala 数组

javascript - 将 HTML 表单中的拆分值求和,用作 Google 散点图的数据

bash - 函数局部只读与全局只读同名变量

javascript - 面向对象的 JavaScript - AJAX 类