Session.Remove()是否清除c#中的内存?

时间:2009-11-06 17:11:25

标签: c# asp.net session

我使用Session变量将数据表从1页传递到另一页。有时,数据表可以包含超过100,000条记录。运行几次之后,我会抛出Out of Memory异常,所以我想我有几个问题?

Session是解决此问题的最佳方法吗?

Session.Clear(“会话”)是否从内存中释放它?如果没有,是否有任何事情从内存中释放会话?

如果我将一个数据表存储到一个Session对象中,然后我将另一个数据表存储到同一个Session对象中,它是继续使用内存还是将其写入现有的Session对象?

3 个答案:

答案 0 :(得分:5)

我假设你在谈论进程内会话状态。

您实际上并未将DataTable本身存储在会话中。而是存储对DataTable的引用。因此,当您创建一个新的DataTable并将其添加到会话时,您只需覆盖该引用。你仍然在内存中的某个地方有两个DataTable,直到垃圾收集清理任何没有实时引用的数据。

请记住.net中的垃圾收集是非确定性的。也就是说,将对象设置为null不会立即释放内存。它只是标记它,并且在将来的某个时刻,垃圾收集器可能会看到死对象并释放与之关联的内存。

如果您的内存不足,您可能想重新考虑您的设计。最好让第二页重新获取数据,可能来自缓存层(可能是在另一张海报建议的应用服务器上实现的),也可能是数据库本身。

答案 1 :(得分:-1)

使用app-server图层来保存数据,每个页面都应该从那里获取...

答案 2 :(得分:-1)

我的第一个问题是你需要将整个数据库存储在Session或Application中?这是一个good article,它覆盖了您的所有选项,并建议不要在Session或Application缓存中存储大量数据。你想通过这样做解决什么问题?

修改

您是否在该页面上一次显示所有数据?恩。向下滚动10000条记录。如果这样听起来不是非常用户友好(假设)。您是否考虑过分页数据?您可以拥有50个记录和n个页面的页面。这将使数据调用更快,然后您可以实现过滤,排序等。