假设我们有一个由Tomcat等servlet引擎/容器支持的Web应用程序.用户登录.加载该用户的数据库记录(由类User的实例表示,比方说),我们可以将其存储为具有键"currentUser"的会话属性,设置一次,并将其用于处理后续请求.另外,我们在session属性中添加了更多对象.很基本的东西.
现在,如果我们需要部署一些新代码并重新启动Tomcat ......用户会话在重新启动后(从磁盘/ db恢复)仍然完好无损,只要我们不更改其实例存储在用户中的任何类会议.但这是一个大问题.我不希望用户在新代码发布时丢失会话.
为了解决这个问题,我想我只能在会话对象中存储假设永不改变的类的实例(比如将登录用户的ID存储为Integer而不是User类的实例).然后,我永远不会遇到无法在重新启动时反序列化会话对象的问题.但这会使事情稍微复杂化,因为现在我必须使用ID从数据库中加载实际对象等(并且通过缓存,性能命中并不是真正的问题).
这是解决这个问题的典型方法吗?
我在MySQL 5.0,5.1,5.5上测试了以下看似简单的查询,发现它非常慢.
select * from entry where session_id in
(select session_id from entry where created_at > [some timestamp])
Run Code Online (Sandbox Code Playgroud)
多个条目可以具有相同的会话ID,但具有不同的created_at时间戳.该查询旨在获取所有条目,这些条目具有来自同一session_id的至少一个条目,其create_at大于指定的时间戳.
我见过其他人谈到类似查询的MySQL子查询性能问题,并且MySQL认为子查询是一个依赖查询,它正在对外部查询进行全表扫描.建议的解决方法类似于:
select * from entry where session_id in
(select session_id from
(select session_id from entry where created_at > [some timestamp])
as temp)
Run Code Online (Sandbox Code Playgroud)
但是,这个hack对我不起作用,使它更慢.
有关如何重写此查询的任何想法?