Tomcat Web应用程序 - 将对象存储为用户定义的对象或简单ID,以通过服务器重启来持久保存用户会话?

n00*_*00b 5 java session serialization tomcat reboot

假设我们有一个由Tomcat等servlet引擎/容器支持的Web应用程序.用户登录.加载该用户的数据库记录(由类User的实例表示,比方说),我们可以将其存储为具有键"currentUser"的会话属性,设置一次,并将其用于处理后续请求.另外,我们在session属性中添加了更多对象.很基本的东西.

现在,如果我们需要部署一些新代码并重新启动Tomcat ......用户会话在重新启动后(从磁盘/ db恢复)仍然完好无损,只要我们不更改其实例存储在用户中的任何类会议.但这是一个大问题.我不希望用户在新代码发布时丢失会话.

为了解决这个问题,我想我只能在会话对象中存储假设永不改变的类的实例(比如将登录用户的ID存储为Integer而不是User类的实例).然后,我永远不会遇到无法在重新启动时反序列化会话对象的问题.但这会使事情稍微复杂化,因为现在我必须使用ID从数据库中加载实际对象等(并且通过缓存,性能命中并不是真正的问题).

这是解决这个问题的典型方法吗?

Pie*_*rre 3

简单的解决方案

正如您所建议的,在会话中仅加载 userId,并使用缓存服务(例如 ehcache)来检索用户对象。如果用户对象不存在,它将第一次加载,但随后它将被缓存,后续请求将非常快。如果您担心用户类别的更改,请仅将缓存设置为基于内存,以便它在服务器重新启动之间重置。

平台解决方案

看看 Terracotta (http://www.terracotta.org/)。如果您能够在他们的平台上部署会话,他们将允许您在服务器重新启动之间维护它们,并在保留旧字段的同时更新实际的用户类。一旦你启动并运行它,这将是非常酷的事情。

请记住,Terracotta 集成并不简单,也不适合新手。然而,好处是所有 Web 应用程序通常都需要的可扩展性和高可用性。