当我致电hreq.getSession().invalidate();
时,应用引擎速度会大幅下降。我查看了appstats,看到在没有进行数据库调用的页面上,它每次调用memcache.get和datastore.get 23次。这些调用的堆栈跟踪显示它是从getSession()调用的。这只发生在生产服务器上。每次我向页面发出请求时,都会产生一堆memcache和数据存储区调用。当我重新启动浏览器时,这种减速消失了。
当我更改代码以简单地将会话的isLoggedIn
属性设置为false,而不是调用hreq.getSession().invalidate();
时,一切都很好。
作为测试,我没有使会话无效,但我更改了浏览器会话cookie的值,并且应用引擎展示了相同的行为。
这是应用引擎的错误吗?
答案 0 :(得分:2)
getSession()与memcache和数据存储区交互并不奇怪。使用数据存储区查看器查看_ah_SESSION实体。您会注意到这是一个Blob,Blob是会话信息。看看this。
App Engine包含一个实现 会话,使用servlet会话 接口。实施商店 App Engine中的会话数据 持久性的数据存储区,以及 使用memcache来提高速度。和大多数人一样 其他servlet容器,会话 使用设置的属性 session.setAttribute()期间 请求将保存到数据存储区 请求结束。
如果您使会话无效,则需要创建一个新会话,这需要与memcache和数据存储区进行交互。