问题描述
假如有一实体类:classuserEntity{privatestring_name="";publicstringName{set{_name=value;}get{return_name;}}}
我们在页面中进行了以下操作:userEntityu=newuserEntity();u.Name="test";this.Session["user"]=u;
即将一个实体类存于Session中我的问题是?垃圾加收机质是如何管理此对象的???正常情况下,我们在一个方法中new一个新的对象到一个变量中,变量是在线程堆栈中存放的一个地址,指向托管推中的数据,当方法结束,变量的生命周期结束,线程堆栈中的地址首先失效,然后垃圾回收检测到原来该地址指向数据已经在线程堆栈中没有地址指向,则回收托管堆中的数据。存于Session的情况是不是这样子的,session变量中存的也是一个地址,这个地址的生命周期就是session变量的生命周期,session丢失之后,才会回收托管堆中的数据??之所以得出这样的结论是因为我测试过这样的情况,在一个页面中userEntityu=(userEntity)Session["user"];u.Name="changed";
然后在另一个页面userEntityu=(userEntity)Session["user"];Response.Write(u.Name);
结果显示为"changed"由此我得出结论,SESSION中存的为一个地址;但另一种情况又让我无法解释??在session存储设置为存储于sqlserver中的WEB应该程序中。我将一对象存于Session中,对象的类必须为可序列化的,既然只是存一个地址的话,为何要要求类可序列化,这让我感觉SESSION中存储又应该是数据本身。。。有高手指点儿一下吗?这两天老在想这个问题。。。
解决方案
解决方案二:
存放session中的变量是有生命周期的.一般1分钟左右会检测一次.测量时间可以使用Global.asax中Session_StartSession_End来测量系统多长时间来检测session是否过期时间.设置seession过期时间为30秒.如果系统为1分钟为检测一次.则1分钟才触发SessionEnd事件.如果session过期则销毁.-------------------------------------------------------------------------------------在session存储设置为存储于sqlserver中的WEB应该程序中。是以文本形式存在放数据库.把对象转换成文本形式.需要类必须为可序列化.两种存储机制不一样,前一种是存放在服务器内存中,后一种以持久化方式存放在数据库中。
解决方案三:
Session也会发送至客服端吧....不太清楚。。up
解决方案四:
IIS进程来回收SESSION..服务器繁忙的时候..IIS的进程会自动回收Session..所有有的时候Session的值会丢失.请尽量少使用Session.---------------------------------------------------------结果显示为"changed"由此我得出结论,SESSION中存的为一个地址;但另一种情况又让我无法解释??在session存储设置为存储于sqlserver中的WEB应该程序中。我将一对象存于Session中,对象的类必须为可序列化的,既然只是存一个地址的话,为何要要求类可序列化,这让我感觉SESSION中存储又应该是数据本身。。。----------------------------------当会话存储在SQLSERVER数据库中,每个WEB请求结束时在客户端的SESSION集合中序列化并保存所有对象..当客户端重新访问服务器时..相关的辅助进程从状态服务器中以二进制流的形式检索这些对象.请它们反序列化为实时实例,并将它们放置回对请求处理程序的新Session集合对象中.-------------------------------SESSION的三种存储模式要理解清楚...
解决方案五:
IIS进程来回收SESSION..服务器繁忙的时候..IIS的进程会自动回收Session..所有有的时候Session的值会丢失.请尽量少使用Session.---------------------------------------------------------结果显示为"changed"由此我得出结论,SESSION中存的为一个地址;但另一种情况又让我无法解释??在session存储设置为存储于sqlserver中的WEB应该程序中。我将一对象存于Session中,对象的类必须为可序列化的,既然只是存一个地址的话,为何要要求类可序列化,这让我感觉SESSION中存储又应该是数据本身。。。----------------------------------当会话存储在SQLSERVER数据库中,每个WEB请求结束时在客户端的SESSION集合中序列化并保存所有对象..当客户端重新访问服务器时..相关的辅助进程从状态服务器中以二进制流的形式检索这些对象.请它们反序列化为实时实例,并将它们放置回对请求处理程序的新Session集合对象中.-------------------------------SESSION的三种存储模式要理解清楚...______________________________________________________________________________________多谢回答,在用SQLSERVER存储时,我们到SESSION中的对象取出,做以下操作:userEntityu=(userEntity)Session["user"];u.Name="changed";而不写以下语句:Session["user"]=u;也就是说不显式的把对象再存回SESSION变量中,但我在另一个页面重新访问SESSION变量,得到NAME属性的值也还会变成"changed",,这是为什么呀??难道userEntityu=(userEntity)Session["user"];u.Name="changed";这样的语句就可以导致SESSION机制更新存储于SQLSERVER中的序列化后的值吗??按我的理解,应该要显式的写出Session["user"]=u;这样的语句,才会让SQLSERVER更新序列化值呀??请高手解答
解决方案六:
顶
解决方案七:
该回复于2008-06-04 17:32:42被版主删除
解决方案八:
userEntityu=(userEntity)Session["user"];u.Name="changed";而不写以下语句:Session["user"]=u;也就是说不显式的把对象再存回SESSION变量中,但我在另一个页面重新访问SESSION变量,得到NAME属性的值也还会变成"changed",,这是为什么呀??难道userEntityu=(userEntity)Session["user"];u.Name="changed";这样的语句就可以导致SESSION机制更新存储于SQLSERVER中的序列化后的值吗??按我的理解,应该要显式的写出Session["user"]=u;这样的语句,才会让SQLSERVER更新序列化值呀??请高手解答--------------------------------------------------------------------------------------------Session["user"]中存放的是实体对象引用地址.userEntityu=(userEntity)Session["user"];u存放的也是实体引用地址与Session["user"]存放的是一致的.u与Session["user"]都是指向一个内存地址.进程检测到Seesion管理的对象内容发生改变.就会序列化.
解决方案九:
顶