假设我们有一个由Tomcat等servlet引擎/容器支持的Web应用程序.
用户登录.加载该用户的数据库记录(由类User的实例表示,比方说),我们可以将其存储为具有键“currentUser”的会话属性,设置一次,并将其用于处理后续请求.另外,我们在session属性中添加了更多对象.很基本的东西.
现在,如果我们需要部署一些新代码并重新启动Tomcat ……用户会话在重新启动后(从磁盘/ db恢复)仍然完好无损,只要我们不更改其实例存储在用户中的任何类会话.但这是一个大问题.我不希望用户在新代码发布时丢失会话.
为了解决这个问题,我想我只能在会话对象中存储假设永不改变的类的实例(比如将登录用户的ID存储为Integer而不是User类的实例).然后,我永远不会遇到无法在重新启动时反序列化会话对象的问题.但这会使事情稍微复杂化,因为现在我必须使用ID从数据库中加载实际对象等(并且通过缓存,性能命中并不是真正的问题).
这是解决这个问题的典型方法吗?
解决方法:
简单解决方案
如您所建议的那样,只在会话中加载userId,并使用缓存服务(如ehcache)来检索用户对象.如果用户对象不存在,它将在第一次加载,但随后将被缓存,后续请求将非常快.如果您担心用户类更改,请仅基于缓存内存,以便在服务器重新启动之间重置.
平台解决方案
看看Terracotta(http://www.terracotta.org/).如果您能够在其平台上部署会话,则可以在服务器重新启动之间维护它们,并在保留旧字段的同时更新实际用户类.一旦你启动并运行它就会很酷.
请记住,Terracotta集成并不简单,不适合初学者.然而,好处是所有Web应用程序通常都需要的可伸缩性和高可用性.