Java Google应用程序引擎-调用getSession().invalidate();导致应用程序引擎行为怪异
当我调用Java Google应用程序引擎-调用getSession().invalidate();导致应用程序引擎行为怪异,java,google-app-engine,session,Java,Google App Engine,Session,当我调用hreq.getSession().invalidate()时应用程序引擎速度大大降低。我查看了appstats,发现在一个没有数据库调用的页面上,它分别调用了memcache.get和datastore.get 23次。这些调用的堆栈跟踪显示它是从getSession()调用的。这仅在生产服务器上发生。每次我向页面发出请求时,它都会进行一系列memcache和datastore调用。不过,当我重新启动浏览器时,速度会变慢 当我更改代码,将会话的isLoggedIn属性设置为false,
hreq.getSession().invalidate()时代码>应用程序引擎速度大大降低。我查看了appstats,发现在一个没有数据库调用的页面上,它分别调用了memcache.get和datastore.get 23次。这些调用的堆栈跟踪显示它是从getSession()调用的。这仅在生产服务器上发生。每次我向页面发出请求时,它都会进行一系列memcache和datastore调用。不过,当我重新启动浏览器时,速度会变慢
当我更改代码,将会话的isLoggedIn
属性设置为false,而不是调用hreq.getSession().invalidate()代码>,一切都很好
作为测试,我没有使我的会话无效,但我更改了浏览器会话cookie的值,应用程序引擎显示了相同的行为
这是应用程序引擎的一个bug吗?getSession()与memcache和数据存储交互也就不足为奇了。使用数据存储查看器查看_ah_会话实体。您会注意到这是一个Blob,Blob是会话信息。看一看
appengine包括一个实现
使用servlet会话的会话数
接口。实现存储
应用程序引擎中的会话数据
用于持久性的数据存储,以及
使用memcache提高速度。和大多数人一样
其他servlet容器,会话
使用设置的属性
会话期间的session.setAttribute()
请求保存到位于的数据存储中
请求的结尾
如果要使会话无效,则需要创建一个新会话,这需要与memcache和数据存储进行交互。是的,但它会进行大约20次数据库调用,在我重新启动浏览器之前,它会在我访问的每个页面上执行此操作。