要在会话变量中添加什么
我最近遇到了一个ASP 1.1 Web应用程序,该应用程序将一堆东西放在会话变量中,包括所有DB数据对象甚至DB连接对象。最终变得巨大。当Web会话超时(用户完成使用该应用程序的四个小时)后,有时其数据库事务将回滚。我假设这是因为在IIS终止会话时,数据库连接未正确关闭。
无论如何,我的问题是会话变量中应该包含什么?显然,这里需要一些东西。用户在主屏幕上选择要编辑的计划,因此计划ID进入会话变量。最好通过在会话变量中存储有关用户(及其管理员等)和他们正在编辑的计划的所有详细信息来减少数据库的负载,还是我应该尽量减少会话变量中的内容和查询数据库以获取我在Page_Load事件中所需的一切?
解决方案
回答
这很难回答,因为它是如此特定于应用程序的,但是这里是我使用的一些准则:
- 尽可能少地参加会议。
- 仅在给定访问期间才能持续的针对用户的选择是一个不错的选择
- 通常,在用户访问网站期间需要访问多个页面的变量(以避免将它们从一个页面传递到另一个页面)也很适合放入会话中。
从我们对应用程序的评论中,我可能会从数据库中选择数据,并尝试找到使这些查询的影响最小化的方法,而不是加载会话。
回答
不要将UI对象放入会话中。
除此之外,我会说它有所不同。如果我们不使用进程内会话,那么过多的会话可能会减慢速度,因为我们将要序列化很多+提供程序的速度。缓存和会话应谨慎使用。不要仅仅因为可以或者方便而进行会话。坐下来分析是否合理。
回答
不要在会话中放入数据库连接信息。
至于缓存,如果可能的话,我会避免使用会话进行缓存-我们会遇到其他人更改用户正在使用的数据的问题,而且我们将无法在用户之间共享缓存的数据。使用ASP.NET缓存或者其他一些缓存实用程序(如Memcached或者Velocity)。
至于会话中应进行的操作,适用于用户已打开到我们站点的所有浏览器窗口的所有内容(登录,安全设置等)都应在会话中。诸如正在查看/编辑的对象之类的东西实际上应该是在屏幕之间传递的GET / POST变量,以便用户可以使用多个浏览器窗口来处理应用程序(除非我们希望避免这种情况)。
回答
之前有人问过有关PHP会话的非常相似的问题。基本上,会话是存储需要在多个页面加载中访问的特定于用户的数据的好地方。会话不是存储数据库连接引用的好地方。我们最好使用某种连接池软件,或者在每次页面加载时打开/关闭连接。至于在会话中缓存数据,这取决于会话数据的存储方式,所需的安全性以及该数据是否特定于用户。更好的选择是将其他内容用于缓存数据。
回答
在会话中存储导航提示非常棘手。同一用户可以打开多个窗口,然后以混乱的方式传播更改。绝对不应该存储数据库连接。 ASP.NET可以为我们维护连接池,而无需诉诸我们自己的魔术。如果我们需要短时间缓存内容,并且数据集的大小相对较小,则可以考虑使用ViewState(以将更多的批量加载到页面大小为代价)
回答
答:仅与一个用户有关的数据。 IE:用户名,用户ID。最多一个代表用户的对象。有时,相对于URL的数据(例如去哪里找人)或者错误消息堆栈对于将其推送到会话中很有用。
如果我们想潜在地在不同用户之间共享内容,请使用应用程序存储或者缓存。他们远胜于此。
回答
史蒂芬
我们是否在以" I"开头的公司和以" BC"开头的网站工作?这听起来完全像我刚开始在.net中开发时(当时又年轻又愚蠢)所做的一样-我塞满了在会话和应用程序中想到的所有内容。不用说,这是双重加弊。
通常,尽可能避免会话。当然,不可序列化的对象也不应存储在其中(数据库连接等),但是即使大型,可序列化的对象也不应存储在其中。我们就是不想要开销。
回答
理想情况下,ASP中的会话应存储最少的数据量。存储对保持系统资源开放(尤其是数据库连接)的任何对象的引用是绝对的可伸缩性杀手。同样,在大多数情况下,将未提交的数据存储在会话变量中也是一个坏主意。总的来说,这听起来像当前的实现正在滥用会话对象来尝试在一个假定的无状态环境中模拟一个有状态的应用程序。
尽管存在很多弊端,但是通过隐藏字段自动管理状态的ASP.NET模型应该真正消除了将任何内容保留在会话变量中的大部分需求。
我的经验法则是,应用程序需要的可扩展性(就用户/点击量而言)越多,使用会话状态就越难以捉摸。但是,需要权衡取舍。对于用户重复访问相同数据并且每次使用站点通常会话时间较长的Web应用程序,某些缓存(如果需要,在会话对象中)实际上可以通过减少数据库服务器上的负载来帮助扩展。这里的想法是,与后端数据库相比,存储表示层的成本要低得多,也要复杂得多。当然,无论如何,此建议应谨慎处理,并不能在所有情况下都适用,但是对于一个相当简单的内部CRUD应用程序,它应该可以很好地为我们服务。
回答
我将始终在会话中保留很少的信息。会话使用服务器内存资源,这很昂贵。在会话中保存太多的值会增加服务器的负载,最终站点的性能将下降。使用负载平衡服务器时,会话的使用可能会遇到问题。因此,我要做的是使用最少的会话或者不使用任何会话,如果信息不是很关键,则使用cookie,更多地使用隐藏字段,并使用数据库会话。