造成Jaee服务器宕机的代码错误之一对象未序列化
一般B/S架构的信息,基本上都要把一些常用的信息放在Session 中,这样不用每次都要访问数据库,比如用户的信息.
类似有一个场景,
我们新建了一个对象UserInfo,用来保存登陆用户的信息,当用户正确登陆后,我们就把它保存在session中,供我们以后使用.
如果我们的这个UserInfo对象,没有声明序列化接口.
当我们在开发的时候,自己测试的时候,是不会发现有什么问题的,好象一切都很正常.
但是正式上线,在系统的并发用户操过一定数量的时候,就会发现很多用户都不能正常使用,骂声一片了.
然后你去查看服务器日志,会发现很多Session被破坏的异常抛出.
这个是什么原因呢?
这个是和Session持久化是有关系的.
什么是Session持久化呢?
我们可以想一下,Session中的对象其实是存储在内存当中的,内存是很宝贵的资源,如果一个用户session里放了1M数据,那么同时1000个用户在使用我们的系统,就吃了1G内存,在加上服务器其他开销,如果有2000甚至更多的用户,那我们的服务器肯定就挂了.
在Sun制定的Servelt容器规范里,好象有关于Session持久化的规范,就是说,容器需要实现对Session对象的管理,
根据对Web容器的配置,可以实现对Session的管理,
也就是说web服务器可以帮你自动的对session进行管理,把一些 未活动的session保存在其他地方,当需要使用的时候,在从其他地方加载到内存中.
如果你session中存储的对象未实现序列化接口,那么经过这样的转化,就没办法才重新生成对象,就会抛出 session被破坏的异常了.
还有一个要注意的是,如果你的 session中需要保存大对象,比如我们的UserInfo 对象中,有一个成员是Vector对象,
虽然你UserInfo 实现了序列化接口,但是你在这个对象中还有一个成员是Vector,因为Vector 是不能被序列化的,所
以,你的UserInfo 对象虽然实现了序列化接口,但是最终还是会抛出异常的,使用 arraylist 是可以的,因为它实现了序
列化接口
推荐文章 |

