小编n00*_*00b的帖子

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

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

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

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

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

java session serialization tomcat reboot

5
推荐指数
1
解决办法
1129
查看次数

MySQL子查询真的很慢......解决方法?

我在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对我不起作用,使它更慢.

有关如何重写此查询的任何想法?

mysql performance subquery

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×1

mysql ×1

performance ×1

reboot ×1

serialization ×1

session ×1

subquery ×1

tomcat ×1