我最近遇到了一个ASP 1.1 Web应用程序,它在会话变量中放入了大量内容 - 包括所有数据库数据对象甚至数据库连接对象.它最终变得巨大.当Web会话超时(用户使用完应用程序四小时后),有时会回滚其数据库事务.我假设这是因为当IIS终止会话时,数据库连接没有正确关闭.
无论如何,我的问题是会话变量应该是什么?显然有些事情需要在那里.用户在主屏幕上选择要编辑的计划,因此计划ID将进入会话变量.通过存储有关用户(及其管理员等)的所有详细信息以及他们在会话变量中编辑的计划来尝试减少数据库的负载是否更好?或者我应该尝试最小化会话变量中的内容和在Page_Load事件中查询数据库中我需要的所有内容?
这很难回答,因为它是特定于应用程序的,但这里有一些我使用的指南:
尽量少在会议中.
用户特定的选择应该只在给定访问期间持续是一个不错的选择
通常,在整个用户访问您的网站时需要访问多个页面的变量(以避免在页面之间传递它们)也很适合放入会话中.
从您对应用程序的说法很少,我可能会从数据库中选择您的数据并尝试找到最小化这些查询的影响而不是加载会话的方法.
千万不能把数据库连接信息的会话.
就缓存而言,如果可能的话,我会避免使用会话进行缓存 - 你会遇到其他人更改用户正在使用的数据的问题,而且你不能在用户之间共享缓存的数据.使用ASP.NET Cache或其他一些缓存实用程序(如Memcached或Velocity).
至于应该在会话中应该做什么,适用于用户已经打开到您的站点的所有浏览器窗口的任何内容(登录,安全设置等)应该在会话中.正在查看/编辑对象的内容应该是在屏幕之间传递的GET/POST变量,这样用户可以使用多个浏览器窗口来处理您的应用程序(除非您想要阻止它).