gpt4 book ai didi

c# - 在 asp.net session 中存储 DataTable 对象是个坏主意

转载 作者:太空狗 更新时间:2023-10-29 22:54:44 25 4
gpt4 key购买 nike

我知道将 DataTable 存储在 asp.net 的 session 变量中是不好的,因为它会占用大量服务器内存。我不明白的是,你在什么时候做什么:

  1. 用户来到需要加载 DataTable 对象(来自 SQL Server)的页面。
  2. 用户点击简单事件的单选按钮(例如,某些控件被禁用)。
  3. 如果您不在 session 中保存 DataTable 对象,您必须在同一页面上回发时再次从 SQL 服务器加载它,而不是仅仅从 session 中获取它?

感谢您的帮助。

最佳答案

DataTable 是非常重的对象,因此不建议将其存储在 ViewState 或 Session 中。您描述的场景是关于缓存数据的。那么,为什么不使用 ASP.NET 的缓存呢?

ViewState,虽然它在服务器上使用的内存不如 Session 或 Cache,但仍然需要在服务器上进行序列化/反序列化,需要一些临时内存使用,除了为您的用户提供每次发送到/来自服务器的请求都有大量数据(只需在任何浏览器中查看查看源代码,您就会看到一个非常大的隐藏输入,其中包含 base-64 编码数据)。如果您不使用加密,任何人都可以解码每个请求中传送的数据,如果其中任何数据是敏感的,就会导致潜在的安全问题。 ViewState 也适用于少量数据,通常最好坚持使用主要数据类型,如整数和字符串。

Session 通常也不是一个好主意,因为它还需要序列化/反序列化,这除了会增加每个用户的内存压力之外还会增加额外的开销。 session 有memory limits随着并发用户的增加,每个用户的数量会减少。 session 数据不会“过期”,直到每个用户的实际 session 过期为止,默认情况下为 30 分钟。 session 非常适合特定于用户的数据,但建议保持非常小,并再次坚持使用主要数据类型,如整数和字符串。

Cache 不序列化任何数据并且是 limited in size仅由于操作系统的位数。在 Windows 2003 32 位上,您可以使用 800 MB 的总应用程序池大小(如果使用/3GB 开关,则为 1.2 或 1.3 GB)。在 64 位下,有更多的自由和限制实际上只是您配置的可用系统内存量。缓存的一个好处是,随着内存压力的增加,缓存可以过期以释放内存用于更重要的事情。当内存压力不是一个因素时,您还可以控制项目何时过期(不能保证过期)。采取额外的步骤,如果使用 SQL Server,您可以将缓存依赖于数据库中的数据,从而允许数据本身决定何时使缓存过期,从而确保数据新鲜。

最后,可以使用经常被遗忘的 Application 对象,但仅限于您知道可以在用户之间共享并且不需要经常更改的数据(希望在应用程序重启之前不要) .

使用 Microsoft 的文档 ViewState , Session , Cache , 和 Application对象,以确定每个对象在您的特定场景中的最明智用途。除了使用 AJAX(避免整页回发)和 HTTP 压缩以减少传递给客户端的有效负载之外,正确使用这些方法的组合可以打造响应速度非常快的网站。

在网络场和负载平衡等更复杂的场景中,还有其他问题需要考虑。您需要问自己的问题如下:如果用户访问与最初请求的服务器不同的服务器,是否应该创建一个新 session ?无论用户访问哪个服务器,缓存都应该起作用吗?这些问题将带您找到可能会改变数据存储位置的解决方案。 InProc Session 比使用 SQL Server 作为 session 服务器更宽容,因为有额外的序列化限制。

关于c# - 在 asp.net session 中存储 DataTable 对象是个坏主意,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com