我最近遇到一个 ASP 1.1 Web 应用程序,它将一大堆东西放入会话变量中 - 包括所有数据库数据对象,甚至数据库连接对象。它最终变得巨大。当 Web 会话超时时(用户使用完应用程序后四个小时),有时他们的数据库事务会回滚。我假设这是因为 IIS 终止会话时数据库连接没有正确关闭。

无论如何,我的问题是会话变量中应该包含什么?显然,有些东西需要放在里面。用户在主屏幕上选择要编辑的计划,因此计划 ID 会进入会话变量。是否最好通过存储有关用户(及其经理等)的所有详细信息以及他们在会话变量中编辑的计划来尝试减少数据库的负载,或者我应该尝试最小化会话变量中的内容并在 Page_Load 事件中查询数据库以获取我需要的所有内容?

有帮助吗?

解决方案

这个问题很难回答,因为它是特定于应用程序的,但这里有一些我使用的指南:

  1. 在会话中投入尽可能少的内容。
  2. 仅在给定访问期间持续的用户特定选择是一个不错的选择
  3. 通常,在用户访问站点期间需要多个页面访问的变量(以避免将它们从一个页面传递到另一个页面)也适合放入会话中。

根据您对应用程序的描述,我可能会从数据库中选择您的数据,并尝试找到方法来最小化这些查询的影响,而不是加载会话。

其他提示

不是 将数据库连接信息放入会话中。

就缓存而言,如果可能的话,我会避免使用会话进行缓存——您会遇到其他人更改用户正在使用的数据的问题,而且您无法在用户之间共享缓存的数据。使用 ASP.NET Cache 或其他一些缓存实用程序(例如 Memcached 或 Velocity)。

至于什么 应该 参加会议,任何适用于 全部 用户打开您的站点的浏览器窗口(登录、安全设置等)应该在会话中。像正在查看/编辑的对象之类的事情实际上应该是在屏幕之间传递的 GET/POST 变量,以便用户可以使用多个浏览器窗口来处理您的应用程序(除非您想阻止这种情况)。

不要 将 UI 对象放入会话中。

除此之外,我想说它有所不同。如果您不使用进程中会话,会话中太多内容可能会减慢您的速度,因为您将进行大量序列化+提供程序的速度。缓存和会话应该谨慎使用。不要只是因为可以或方便而参加会议。坐下来分析一下是否有道理。

理想情况下,ASP 中的会话应该存储您可以使用的最少量的数据。存储对任何保持系统资源打开(特别是数据库连接)的对象的引用绝对是可伸缩性杀手。此外,在大多数情况下,将未提交的数据存储在会话变量中并不是一个好主意。总体而言,听起来当前的实现正在滥用会话对象来尝试在所谓的无状态环境中模拟有状态应用程序。

尽管饱受诟病,但通过隐藏字段自动管理状态的 ASP.NET 模型确实应该消除在会话变量中保留任何内容的大部分需要。

我的经验法则是,应用程序需要的可扩展性越高(就用户/点击量而言),使用会话状态的可能性就越小。然而,这是一个权衡。对于用户重复访问相同数据并且每次使用站点通常有相当长的会话的 Web 应用程序,一些缓存(如果在会话对象中需要的话)实际上可以通过减少数据库服务器上的负载来帮助可扩展性。这里的想法是,与后端数据库相比,构建表示层要便宜得多且复杂度要低得多。当然,对于所有事情,这个建议应该适度采纳,并且并不适用于所有情况,但对于一个相当简单的内部 CRUD 应用程序来说,它应该对您很有帮助。

A 非常相似的问题 之前被问及有关 PHP 会话的问题。基本上,会话是存储您需要跨多个页面加载访问的用户特定数据的好地方。会话不是存储数据库连接引用的好地方;您最好使用某种连接池软件或在每次页面加载时打开/关闭连接。至于在会话中缓存数据,这取决于会话数据的存储方式、您需要多少安全性以及数据是否特定于用户。更好的选择是使用其他东西来缓存数据。

在会话中存储导航提示很棘手。同一用户可以打开多个窗口,然后更改会以令人困惑的方式传播。数据库连接应该 确实 不被存储。ASP.NET 为您维护连接池,无需求助于您自己的魔法。如果您需要短期缓存内容并且数据集大小相对较小,请考虑 ViewState 作为一个可能的选项(代价是在页面大小上加载更多数据)

A:仅与一个用户相关的数据。IE:用户名、用户 ID。在 最多 代表用户的对象。有时,与 URL 相关的数据(例如带某人去哪里)或错误消息堆栈对于推送到会话中很有用。

如果您想在不同用户之间共享内容,请使用应用程序商店或缓存。他们要优越得多。

斯蒂芬,
您是否在一家以“I”开头且拥有以“BC”开头的网站的公司工作?这听起来和我第一次开始在 .net 中开发时所做的一模一样(当时还年轻又愚蠢)——我把我能想到的所有东西都塞进了会话和应用程序中。不用说,这是双倍不利的。
一般来说,尽可能避免会话。当然,不可序列化的对象不应该存储在那里(数据库连接等),但即使是大的、可序列化的对象也不应该存储在那里。您只是不想要开销。

我总是在会议中保留很少的信息。会话使用昂贵的服务器内存资源。在会话中保存太多值会增加服务器的负载,最终导致站点的性能下降。当您使用负载平衡服务器时,会话的使用可能会遇到问题。所以我所做的是使用最少的会话或不使用会话,如果信息不是很关键则使用cookie,更多地使用隐藏字段和数​​据库会话。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top