我发现使用会话对象(.net)是一种邪恶的做法,我是否过于苛刻?

时间:2009-04-15 16:27:30

标签: asp.net session

询问你对会话对象的看法,我从不使用它(只是被迫工作),因为它在扩展服务器时出现问题。我意识到你可以走出proc并拥有sql server管理会话,但我只是不喜欢它的想法。

我宁愿围绕这个问题构建一个更好的数据库设计,而不仅仅是在会话中抛出东西来保存数据库调用。

我一个人在这个吗?我应该重新考虑我对会议的立场吗?

13 个答案:

答案 0 :(得分:10)

我发现你的立场有些极端。明智地使用会话在我的书中肯定是可以的 - 例如,我在会话中存储了一些偏好(过滤器的可见性等),因为它们与会话相关联而不是在会话中持久化。它肯定会被滥用,但是我反对的是滥用而不是使用。

答案 1 :(得分:10)

根据我的经验,这完全取决于您正在处理的情景:

  • 高流量/网络农场/分布式应用。会话对象通常是一件坏事。您必须将信息集中在某处(共享内存,数据库,其他),然后向其写入/读取性能损失。也就是说,如果没有某种会话状态系统,那么只有这么多才能实现所述应用程序。使用cookie通常是get-out子句 - 只需注意敏感信息。

  • 其他所有。使用会话,它们非常方便。

“这取决于”。

答案 2 :(得分:5)

我认为将数据放入Session在某些情况下很有用,但也很容易变得懒惰并像其他任何功能一样滥用它。所以,我说,在适当的地方使用它。

答案 3 :(得分:5)

我发现使用___________(不恰当地)是一种邪恶的做法。就像我认为吃太多________是一种邪恶的做法。

一切都有它的位置。一切都可能被滥用。知道何时使用什么工具,何时切换是工匠大师的标志。

答案 4 :(得分:2)

你是,但只是一点点。你是绝对正确的 - 在中间件中维护会话状态意味着随着系统变得越来越大,应用程序和网络中出现并发症。

另一方面,相对较少的应用程序实际上变得如此之大,以至于多服务器可伸缩性成为一个问题,因此根据项目的不同,它可能会增加复杂性。

然而,在被证明是无辜之前,我肯定会认为这是有罪的。

答案 5 :(得分:1)

在ASP.NET Web应用程序中使用Session状态没有任何内在错误,只要您谨慎使用它并注意良好的设计原则。例如,在会话状态下缓存大对象然后使用SQL Server来管理会话状态是没有意义的;您将从数据库中读取/写入大量数据,这首先会破坏缓存目标!但是,使用会话状态在页面之间存储一些原语对我来说似乎没问题。

答案 6 :(得分:1)

您应该重新考虑使用会话的内容,而不是完全决定是否使用会话。

有许多方法可以存储来自Cookie,查询字符串以及会话对象的基于“会话”的信息。

会话可能被过度使用......很多......只是因为人们可以严重地使用它,但不会让它变坏。

你想要你的用户对象吗?你只想在那里使用UserId吗?

答案 7 :(得分:1)

Session用于存储临时变量,因此除非您需要在很长一段时间内存储此数据,否则我不明白为什么您需要在数据库中设计专门的表以避免使用会话。至于缩放,请查看Microsoft Velocity(目前在CTP中)。我认为会议是一件好事。但是我遵循的原则是,即使是好的东西,如果不适度使用,也会变成坏事。

答案 8 :(得分:1)

我觉得你太苛刻了。一些人对会话对象的处理并不总是一个好主意,但该技术本身没有任何错误。

缓存是在适当的环境中很好地使用会话对象。例如,缓存存储在数据库中的用户特定数据,除了该用户的操作外,不会频繁更改。这会导致Web服务器上的内存损失,因为数据库服务器上的命中次数会减少。我很乐意做出这种权衡,因为扩展到多个Web服务器比单个SQL服务器更简单,更便宜。

我的一般经验法则是仅将会话用于缓存情况。也就是说,如果代码在会话到期后无法轻松地重新加载而没有用户干预,我就不会去那里。

答案 9 :(得分:0)

使用数据库进行自制会话处理与存储在数据库中的会话状态之间究竟有什么区别?

如果你在服务器上需要一些有状态的东西,那么使用session(当然只有几个小的可序列化对象)对我来说似乎并不是那么糟糕......

答案 10 :(得分:0)

使用Sessions的最佳方法可能是使用它们来缓存会话数据。通过这种方式,您仍然可以在具有会话亲缘性的服务器场环境中将它们保留在InProc中,这样您就可以获得性能优势。但是如果你丢失了会话,你可以通过查询数据库再次获得它。

会话作为一种机制,使会话范围的全局变量 邪恶。

答案 11 :(得分:0)

男人,这就是我的想法,我可能是错的

- 如果你有共享的数据然后使用静态类,我已经有了惊人的经验,而且效率更高。

- 使用配置文件它是强类型,但你首先必须优化它或它会杀死你的网站,这里是非常好的文章 http://msmvps.com/blogs/omar/archive/2006/08/17/optimize-asp-net-2-0-profile-provider-before-you-go-live.aspx

还有一件事是,我从这位伟大的家伙那里学到了一个清除匿名档案的绝妙技巧。

http://leedumond.com/blog/managing-anonymous-users-for-better-site-performance/

希望这会有所帮助。

答案 12 :(得分:0)

会话在某些方面是邪恶的。一,它会让你觉得你可以轻松地存储任何类型的对象,但是当你尝试在多个服务器上进行缩放时,它就像...抱歉,你必须将你存储在那里的所有那些对象都序列化。如果您不想使所有内容都可序列化(或不可以),那么无论何时重建应用程序或回收Web应用程序,您都会遇到进程内会话状态并丢失会话。最后,开启时添加的每个请求都会产生开销,而且对于任何预先打包的开箱即用解决方案,您都会普遍缺乏控制。

从一开始就使用定制的高效解决方案几乎会更好。我使用它的次数越多,我就会发现,就其似乎提供的内容来说,Session有点太方便了,但是有合法的用途。