Session 性能问题

chenshizhencong 2010-11-23 10:00:19
最近小组的同事很喜欢用Session做页面跳转,具体就是在查询页面把查询结果放到DataTable中,用Session存储这个dataTable,读取到数据之后再子页面做Session清除,这样对性能有没有什么影响?Asp.net的通用数据库访问类用静态变量存储连接的字符串,是不是也会造成阻塞?
...全文
412 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixiaoyu928 2011-01-15
  • 打赏
  • 举报
回复
很有意思,关于跨页传值的问题以前我也很纠结。说一下我的观点和建议:
1、session:session的确是存放在服务器的内存中(但不是4k上限,具体大小限制应该是服务器内存),而且同一个sessionid的多个http请求会排队,也就是session对于同一个浏览器来说是同步的,用不好会极大影响性能。另外,session依赖于客户端cookie,因为sessionid是存放在客户端浏览器进程cookie中的,因此不支持cookie的浏览器,session也会丢失。因此不建议用。

2、cookie,也不建议存放datatable这样的“大数据”。因为cookie不仅有4k上限,并且不是“纯存放在客户端”这么简单,要知道cookie的值在每次web页面请求往返的过程中都是要附带在http头中的,如果太大会占用服务器和客户端之间的网络带宽(虽然只是4k,但在线人多了可就是4k * n了)。对于b/s结构的应用来说,网络带宽是性能最主要的瓶颈之一!另外,对于datatbale转换成json字符串再存入cookie,服务器CPU也会消耗。最可怕的是,一但你的cookie忘记删除了,那么在其有效期和作用域内,用户访问你的所有页面时都将携带这个4K大小的http头,那就悲剧了。10000在线人数,4千兆网卡也不够你花的。

3、数据库连接,每次保存查询语句然后再查询的方式不错,不过看你的查询复杂度了,如果很费时的查询,这样调用也是不可取的。内存和cpu的矛盾你要根据实际情况作出选择。对于具有连接池的应用来说,一次连接数据的成本并不高,经过测试差不多=10次调用取当前系统时间函数。但查询语句的复杂度就没谱了。另外,如果并发人数很多的情况下,频繁占用数据库连接,会导致连接池没有可用连接了,那就又悲剧了。此时就不是一次连接的成本,系统整体性能将毁灭性的下降,反应迟钝。

4、cache:一个不错的选择,不过它可同样是占用服务器内存哦,只是比session多了一些灵活性。不过我也不建议你用于存放传递参数的地方。要知道session就算内存满了也不会丢失你的参数值(会抛异常),可cache可不是,它会直接删掉你的参数值,甚至内存极度不足时都不会让你进去(也不会报错)。换句话说,可能上一行代码刚存进去,下一行代码去读就丢了。很可怕吧~

5、form表单:最为提倡的方式,http协议中原本页面间传值的方法就是这样的,只是有时不太方便,能用之则用之。

6、Transfer方法:虽然原理也是在服务器端内存中保存,但他的作用范围很小,只是两页面间,页面对象被回收时,它也就被一同回收了。是一个不错的选择,不过用户浏览器地址可不会改变,后退也会出现些小麻烦。要注意~

7、viewstate:谈不上页面间传值,只是本页面存值。不建议使用,占用网络带宽,而且序列化和反序列化会消耗服务器CPU。最让人难受的是,微软竟把viewstate存放的hidden域输出在页面顶部(<body>标记下面),而不是页面对底部(</body>上面),这样viewstate大的时候,不仅服务器压力大,客户端浏览器显示速度都受影响。郁闷...能不用就不用吧。

8、自定义存储机制:如果你对性能要求很苛刻,或者非要精益求精的话。那么还是自己写一个存储机制吧。例如我自己就是写了自己的XSession对象,它的用法与session使用类似,但是存储机制都是我自己封装的,既有cache的优点、又有session的优点,还有数据库的优点、性能看你写的算法了、而且具有更大的使用灵活性。缺点就是需要你自己coding...
边城的刀声 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 xx_lzj 的回复:]
引用 1 楼 q107770540 的回复:
session吃的是服务器的内存
如果DataTable很大的话 会增加服务器负担 建议session存查询条件 不要存储结果

说的倒没有错误,但本题不太合适。本题到子页立即清空,耗费的不是内存,最影响的是序列化、反序列化带来的性能消耗。
35楼正解,两页传递,用Transfer和PreviousPage可以解决,不存在序列化问题。
另,……
[/Quote]
高手,赶紧脱裤衩吧
hwbox 2010-11-24
  • 打赏
  • 举报
回复
session有大小限制,吃内存。cach也吃内存。cookie不吃,但也有大小限制。隐藏控件,我要没记错的话。form表单大小也有限制。所以没事不要在页面间传递datatable之类的大量数据。对于无状态的web应用来说,这种应用思路就有问题。可以用传递sql语句的方式,在下一个页面重新进行检索。

第二个用静态变量做连接串没有问题,.net在开数据库连接时,对使用同样连接串的连接,做连接池处理。默认好象是池上限十个连接。加上限改参数需在连接串中声明。需要注意的是对打开连接的即时关闭,特别是在程序的异常处理中别忘了关连接。
xx_lzj 2010-11-24
  • 打赏
  • 举报
回复
不要怕使用内存,不管Cache还是Session,在页面Render之前,总是要有服务器内存存放来自Table的数据。
xx_lzj 2010-11-24
  • 打赏
  • 举报
回复

[Quote=引用 1 楼 q107770540 的回复:]
session吃的是服务器的内存
如果DataTable很大的话 会增加服务器负担 建议session存查询条件 不要存储结果
[/Quote]
说的倒没有错误,但本题不太合适。本题到子页立即清空,耗费的不是内存,最影响的是序列化、反序列化带来的性能消耗。
35楼正解,两页传递,用Transfer和PreviousPage可以解决,不存在序列化问题。
另,用静态变量存储连接字符串,怎么会造成阻塞?数据库访问的阻塞一般来自连接池。
边城的刀声 2010-11-24
  • 打赏
  • 举报
回复
而且如果是在服务器间传送,可以用Transfer来实现两个页面间的数据共享,不用Session。
tm62490309 2010-11-24
  • 打赏
  • 举报
回复
建议使用存储过程分页。我这边才写了一个公共的分页存储过程。用起还是很容易了。
如果有需要的话加我QQ给你。
边城的刀声 2010-11-24
  • 打赏
  • 举报
回复
如果这个查询操作很费时间的话,用session没有什么不可以。
边城的刀声 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 tomakelove 的回复:]

建议换种传值方式,Cache不错。
[/Quote]
Cache是全局缓存,而且也要吃内存的。

ToMakeLove 2010-11-24
  • 打赏
  • 举报
回复
建议换种传值方式,Cache不错。
边城的刀声 2010-11-24
  • 打赏
  • 举报
回复
作个压力测试不就完了吗?模拟下一千个人同时访问这个网页,会出现什么样的情况。
li309000011 2010-11-24
  • 打赏
  • 举报
回复
我觉得还是用Cookie吧 用Session会对服务器有压力
zthsn 2010-11-24
  • 打赏
  • 举报
回复
先不谈性能问题 Mocrosoft出的Session本身就是有BUG的 Session在使用中可能会丢失 所以我们才说预防Session出现这种情况我可以用SessionState或者数据库
你把整个datatable放在Session中 Session如果丢失了怎么办呢?
gongsun 2010-11-24
  • 打赏
  • 举报
回复
你们组的头在干啥呢。。。
xellosxd1314 2010-11-24
  • 打赏
  • 举报
回复
直接使用COOKIE不是好得多?
chenshizhencong 2010-11-24
  • 打赏
  • 举报
回复
有没有人用过Google浏览器,怎么总是会有请求不到页面的情况,可是页面都是存在的,用IE的话好像没有这个问题,仔细查了下,好像是请求超时的原因,可是用UPdatePanel的话,有没有什么办法在超时的时候提示信息?
paual779 2010-11-24
  • 打赏
  • 举报
回复
38楼的说话, 楼主可以按照他说的去理解,
chenshizhencong 2010-11-24
  • 打赏
  • 举报
回复
谢谢大家了,我让她改,还特别不乐意,这就结贴了
西门喷血 2010-11-23
  • 打赏
  • 举报
回复
可以使用Cookie ~~
tercelstar 2010-11-23
  • 打赏
  • 举报
回复
建议最好没事别和服务器交互,特别影响性能
加载更多回复(19)

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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