Session 篡位!求助!100分!

chentaizong 2004-04-08 06:11:11
我的系统是:Solaris 8+oracle9iR1websphere4.0.7。日常在线人数大约50~100人。
登录之后把数据库联接、用户ID、所属机构放到session中。
各个用户之间经常发生网页中显示的用户ID、所属机构的别人的情况。
但是我在用户登录的时候已经清理了sesssion的内容了。
Enumeration enumSession =session.getAttributeNames();
while(eValue.hasMoreElements()){
session.removeAttribute(=(String)enumSession.nextElement());
}
我们用的是代理服务器。通过代理服务器连接的用户Session篡位的情况多一些。但是不通过代理服务器连接的用户也有这种情况,只是频率很少。
请高手指点迷津。
我的电邮:chentaizong@sina.com 。
...全文
30 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chentaizong 2004-04-14
  • 打赏
  • 举报
回复
在Tomcat5之下没有这个问题!
chentaizong 2004-04-14
  • 打赏
  • 举报
回复
唉!现在我不用代理服务器,session.isNew()也返回false了。真是不爽!
CoolAbu 2004-04-09
  • 打赏
  • 举报
回复
数据库连接放到Session 能提高效率是一种误区
session的运行机制就不是多线程的,你把Connection放到Session里,这样在并发稍微多一些的情况下,效率明细下来了,你可以做一个实验来检测。

数据库的频繁连接可以考虑使用连接池。

还有尽量优化程序代码,50---100人不多的。
chentaizong 2004-04-09
  • 打赏
  • 举报
回复
感谢诸位:
1、回复 stonecsdn(东东) :
估计是代理服务器的问题,我们的代理服务器启用了缓存。
我如果用代理连接系统,session.isNew()返回false,直接连接返回true。
有没有办法解决?
如果将我的系统设成不允许通过代理服务器访问的话,每个客户端的IE的连接设置都需要改变,我的维护电话会很多。因为很多用户连鼠标双击都不会用。
有没有办法在session.isNew()返回false,我自己new一个session对象?
我觉得用cookie-based sessions虽然可以解决问题,但是cookie的后遗症很大。
2、回复 CoolAbu(阿卜-Never Stop(★★★★)) :
数据库连接放到Session里我是为了提高效率不得已而为之的。
我的系统有2000来个jsp,业务逻辑都在jsp中,几乎每个jsp都涉及数据库操作,主要是查询和出报表,每个sql 查询语句在2、30行到100行之间,消耗几十MB到4、5个GB的内存。
如果数据库联接不放到session里,我要在每个页面处理数据库联接和关闭。还要考虑异常发生时没有正常关闭的数据库连接。用户使用速度也受影响。
我的系统2个cpu,8G内存,数据量200多GB,每月增加10G。连接数不多(100以内),但是每个用户的负荷很大,oracle设成专用模式而非共享才能提高系统稳定性。对于oracle,多几十个连接进程根本不算什么。
但是用户对于查询和出报表的速度比较高,最慢的报表计算时间也不能超过3分钟,一般的要求10秒钟以内。
3、回复 anin2000() :
每次产生用户ID、所属机构信息的时候都new了一个新的实例。
CoolAbu 2004-04-09
  • 打赏
  • 举报
回复
你的数据量是比较大,你的机器环境也让人很羡慕呀。

SQl如果你一次不需要返回太多记录数,那么类似分页的都可以写到存储过程中去。


还有你可以考虑使用J2ee中的CMP。
chentaizong 2004-04-09
  • 打赏
  • 举报
回复
几十万的UNIX机器跑这种几百G数据的分析系统,而且速度还比较快。我觉得对于数据库表的设计能够有优化价值的地方也不多了。对于写SQL的水平,好像可以提高的地方也不多了。
写了几千个sql,还没用到过游标和临时表,都是1条select语句就搞定,取出了所有需要的结果。
chentaizong 2004-04-09
  • 打赏
  • 举报
回复
我用的是连接池,不过连接池对于我这种大负荷、少用户的系统意义不大,我希望用户登录系统之后就一直连着数据库,而且独占一个进程,因为用户上来就是来狂查数据库的,我系统的配置使用户不能重复登录,登录后连着数据库不做事的话大约消耗8M内存(比系统默认值大些),无所谓的,多100个连接也只多消耗800M内存而已。相比之下一个select可能就会用上G的内存。
原来我让用户使用线程来连接oracle,但是很不稳定,个把月就会宕一次机。估计线程比较轻载,各线程之间又共享内存,对付不了一些重载的应用。因为有些表有两亿多条记录,而系统只是两颗主频900MHz的CPU。最先用SQL Server2000搭个测试环境执行一个查询都跑不动。
现在每个用户连接oracle都必须使用单独的进程,系统大约有200来个进程,运行还比较稳定,1年多没有重启机器和oracle了。
2000来个jsp,总不能每个页面都写连接关闭数据库的代码吧。

anin2000 2004-04-08
  • 打赏
  • 举报
回复
每次产生用户ID、所属机构信息的时候有没有new一个新的实例?
CoolAbu 2004-04-08
  • 打赏
  • 举报
回复
Session一般不会这样呀,这样就失去Session的意义了。

你的数据库连接最好不要放到Session里,这样效率不高。

你再检查检查代码,是不是哪儿弄混淆了。
stonecsdn 2004-04-08
  • 打赏
  • 举报
回复
用isNew()判断是不是新的,不是invalidate(),重新生成一个session

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧