是这样的,我参与了一个大型的web项目,前台是用的struts开发的,在编写应用的时候,因为有些前台应用需要大量的业务数据(是公共数据,很多前台展示都需要,大概十几个表中的数据,每个表大概有100行),为了防止反复读取数据库,在每次用户登录的时候(初始化session的时候)我把数据放入十几个Arraylist中(基本上一个表对应一个ArrayList),在把ArrayList通过session.setAttribute放入session中,这样页面使用的时候就可以直接从session中读取数据就可以了。
但是,在后来测试的时候发现,在有些时候显示某个ArrayList中数据的时候会出现乱码,或者其它的本不该出现的数据,
比如:本来ArrayList中应该保存:“性别 ,男 ,女”
结果显示的结果是:“学生分布情况,东城分校,………………”这本来是其它的几个ArrayList中内容,怎么穿到这个Arraylist中了?莫非是内存或者页面的问题?
这个现象是很随机搞不清为什么,请教各位达人指点一下。多谢了。
怀疑可能的问题:
问题发生的可能原因
(1)服务器版本问题:在tomcat5.0上,发生session存取错误的几率比在tomcat4.1上大很多
(2)可能发生了内存的重叠:因为多个用户初始化session的时候,都是复制锁定的代码表中的数据到自己的session中,结合linux的内存管理机制,可能发生的页面重叠的情况。
(3)此外,JAVA的数据存储机制大都是以堆的方式,可能造成了内存数据的重叠
(4)具体说明参考网页:
http://www.jdon.com/jive/article.jsp?forum=16&thread=18806
http://www.yuanma.org/data/2006/1128/article_1872.htm
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770
(5)TOMCAT5注重了软件工程,代码写的很工整,效率没有提高很多。session的存储结构是一个类似HASHMAP的结构。HASH结构对于KEY的排序是乱的,主要根据HASH码和容量决定次序的。
有人遇到过类似的情况吗?给说说吧!
------解决方案--------------------
尽量别这么写,如果不跨页面可以直接再封装一次到VECTOR里,然后提交到下以页,或者声称个临时文件再读取,或者在数据库声称临时表,你这样搞肯定会出问题,而且不规律的问题,根源你就找微软好了,毕竟不了解SESSION核心机智
------解决方案--------------------
我有个办法可以解决,不过不知道效率高不高!!
你把你所有的Arraylist放到一个Arraylist中去,就是不要用一个表一个Arraylist,所有表就一个Arraylist!这样就变一个session了,取值的话,你可以用数组的方式取出来,例子不好写,在hibernate的书上有。我只是给个意见!!
------解决方案--------------------
像这样的数据量 还是不放在session里好 写个文件存取吧 session容易出错
------解决方案--------------------
我说的可能不正确的,我只是希望你试试。
我认为你上面过多的给session附ID的值,这样不好!就是要把所有的Arraylist变一个,
/**
这样就变一个session了??????
*/
这句话是错误的,你本来用的就是一同个session,session.setAttribute(ID,key)是这个关系,我不知道能不能解决你上面的问题,但是我觉得比你用的方法好,而且代码看起来也简洁,易维护;上面的人说读文件,我认为是不可行的,容易发生很多的异常,主要原因是慢。
------解决方案--------------------
我觉得应该写到一个文件里, 建立一个映射(.xml的配置文件),然后 session里存放映射的键值,通过配置文件读数据,这样应该好点。
------解决方案--------------------
读文件要时间的,首先存储文件,再读取文件,想想!!!。。。如果用.XML文件存储的话,你还还去解析它,我认为如果你实在想不到办法再用这个办法,这是最搓的办法了
------解决方案--------------------
你的问题可能和线程有关.提供一个思路,可以自己写个组件,作用不是在session范围,而是在request范围内。这样就能避免这个问题。
------解决方案--------------------
session重叠的现象很多的。深入的研究可以和cokkie相对比。
建议在存放session之前先清空一下!