【问题标题】:Google App Engine loosing state of a JSP bean in session scopeGoogle App Engine 在会话范围内失去 JSP bean 的状态
【发布时间】:2014-04-01 07:49:37
【问题描述】:

我有下面的JSP来测试问题

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="testBean" class="java.util.ArrayList" scope="session"/>

<%
    testBean.add(System.currentTimeMillis());

    for(Object o : testBean){
%>

<%=o.toString()%><br>

<%}%>

如果工作正常,它应该打印最后一页重新加载毫秒的列表。它确实可以在开发服务器上工作,但不能在真正的 GAE 部署上工作。即:

1396278093202
1396336675208
1396337414384 // <- Changes on each page refresh!?!?

在 GAE 上,在 1-3 次重新加载后会失去状态,并且列表停止增长,因此只有最后一个元素在重新加载时更改其值。 bean 有时也会在应用程序更新后幸存下来,所以我猜这可能是内存缓存问题。

scope="session" 会出现此问题。 scope="application"没有问题。

这是一种已知行为吗?是否有任何解决方法或想法?

我使用的是 gae 1.9.1,会话已启用。

更新:

会话属性处理似乎完全崩溃了:

<%
java.util.ArrayList testBean2= (ArrayList) session.getAttribute("testBean2");
if(testBean2==null){
    testBean2= new java.util.ArrayList();
    session.setAttribute("testBean2",testBean2);
}
testBean2.add(System.currentTimeMillis()); 
%>

该属性在第二次刷新后失去其状态.. 因此,从会话中检索列表时,列表的大小始终为 1。

更新 2

我自己找到了解决方法。看我的回答。

【问题讨论】:

    标签: java jsp google-app-engine session


    【解决方案1】:

    GAE 不会在每个请求上保持会话,并且仅在修改时尝试执行此操作,但如果属性是可变的,则也无法检测会话属性的更改,因为它不执行深度对象扫描。

    GEA 所做的是在setAttribute 调用上触发会话持久性。

    解决方案是针对每个请求调用session.setAttribute

    就我而言,解决方法是

    <% session.setAttribute("stupidGaeWorkaround", System.currentTimeMillis());%>
    

    【讨论】:

    • 老兄,你应该得到一块饼干!
    【解决方案2】:

    更好的“解决方法”是在您尝试存储在会话中的对象中覆盖 equalshashCode

    我在会话中遇到了同样的问题,如果我在会话中修改了一个 User 对象(这是我的应用程序中唯一的一个)GAE 不会持久化会话,所以我尝试了你的解决方法它奏效了。 最后,我测试了删除您的解决方法并在 User 类中实现 equalshashcode 并且它也有效。

    我使用的appengine SDK版本是1.9.17

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-26
      • 2018-12-03
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多