我使用Session变量将数据表从1页传递到另一页。有时,数据表可以包含超过100,000条记录。运行几次之后,我会抛出Out of Memory异常,所以我想我有几个问题?
Session是解决此问题的最佳方法吗?
Session.Clear(“会话”)是否从内存中释放它?如果没有,是否有任何事情从内存中释放会话?
如果我将一个数据表存储到一个Session对象中,然后我将另一个数据表存储到同一个Session对象中,它是继续使用内存还是将其写入现有的Session对象?
答案 0 :(得分:5)
我假设你在谈论进程内会话状态。
您实际上并未将DataTable本身存储在会话中。而是存储对DataTable的引用。因此,当您创建一个新的DataTable并将其添加到会话时,您只需覆盖该引用。你仍然在内存中的某个地方有两个DataTable,直到垃圾收集清理任何没有实时引用的数据。
请记住.net中的垃圾收集是非确定性的。也就是说,将对象设置为null不会立即释放内存。它只是标记它,并且在将来的某个时刻,垃圾收集器可能会看到死对象并释放与之关联的内存。
如果您的内存不足,您可能想重新考虑您的设计。最好让第二页重新获取数据,可能来自缓存层(可能是在另一张海报建议的应用服务器上实现的),也可能是数据库本身。
答案 1 :(得分:-1)
使用app-server图层来保存数据,每个页面都应该从那里获取...
答案 2 :(得分:-1)
我的第一个问题是你需要将整个数据库存储在Session或Application中?这是一个good article,它覆盖了您的所有选项,并建议不要在Session或Application缓存中存储大量数据。你想通过这样做解决什么问题?
修改强>
您是否在该页面上一次显示所有数据?恩。向下滚动10000条记录。如果这样听起来不是非常用户友好(假设)。您是否考虑过分页数据?您可以拥有50个记录和n个页面的页面。这将使数据调用更快,然后您可以实现过滤,排序等。