网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

造成Jaee服务器宕机的代码错误之一对象未序列化

http://www.diybl.com/ 2008-3-16  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

一般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 是可以的,因为它实现了序

列化接口

 

 

 

 

 



文章整理:DIY部落 http://www.diybl.com (本站)   【点击打包该文章】
如果图片或页面不能正常显示请点击这里 站内搜索:   

文章评论

请您留言