Google App Engine - 调用getSession()。invalidate();导致app引擎行为怪异

时间:2010-05-29 23:19:16

标签: java google-app-engine session

当我致电hreq.getSession().invalidate();时,应用引擎速度会大幅下降。我查看了appstats,看到在没有进行数据库调用的页面上,它每次调用memcache.get和datastore.get 23次。这些调用的堆栈跟踪显示它是从getSession()调用的。这只发生在生产服务器上。每次我向页面发出请求时,都会产生一堆memcache和数据存储区调用。当我重新启动浏览器时,这种减速消失了。

当我更改代码以简单地将会话的isLoggedIn属性设置为false,而不是调用hreq.getSession().invalidate();时,一切都很好。

作为测试,我没有使会话无效,但我更改了浏览器会话cookie的值,并且应用引擎展示了相同的行为。

这是应用引擎的错误吗?

1 个答案:

答案 0 :(得分:2)

getSession()与memcache和数据存储区交互并不奇怪。使用数据存储区查看器查看_ah_SESSION实体。您会注意到这是一个Blob,Blob是会话信息。看看this

  

App Engine包含一个实现   会话,使用servlet会话   接口。实施商店   App Engine中的会话数据   持久性的数据存储区,以及   使用memcache来提高速度。和大多数人一样   其他servlet容器,会话   使用设置的属性   session.setAttribute()期间   请求将保存到数据存储区   请求结束。

如果您使会话无效,则需要创建一个新会话,这需要与memcache和数据存储区进行交互。