使用Session来存储Datatable

时间:2012-10-10 04:27:55

标签: c# asp.net session memory

目前我们正在使用Sessions在我们的页面中存储数据表,这样我们就不必再使数据库命中一次又一次地获取相同的数据表。但我担心的是它正在使用服务器内存,如果有一天大量用户登录,服务器的响应将变慢,我们的应用程序也可能崩溃。

请告诉我将数据表存储到Sessions中是个好主意还是我们每次都应该从DB获取数据表?

5 个答案:

答案 0 :(得分:7)

作为一般的经验法则,我会说不要使用会话。我没有必要使用会话很长一段时间。一旦你进入一个网络农场,情况会议要么慢得多,要么复杂得多,或者两者兼而有之。

您是否会侥幸成功,取决于您在会话中存储的数据量,以及在会话超时期限内将有多少用户处于活动状态。

现在有很多缓存和内存数据库选项可能是更好的选择。最后,虽然所描述的解决方案听起来有问题,但在实际测量问题之前,我不会优化现有解决方案。

答案 1 :(得分:5)

这取决于数据表中存储的内容。在任何情况下,我都会使用ASP.NET Cache来存储这些数据表,原因如下。

  • 缓存有效期,这意味着您可以根据滑动或绝对到期时间值自动删除它

  • 如果进程内存“压力”过高,将自动删除缓存。

  • 您可以根据某个用户创建一个特定于某个用户的缓存项目,或者为所有用户创建全局缓存项目

例如:

// personalized cache item
string personalCacheKey = string.Format("MyDataTable_{0}", (int)Session["UserID"]);
DataTable myPersonalDataTable = (DataTable)Cache[personalCacheKey];

if (myPersonalDataTable == null)
{
    myPersonalDataTable = database.dosomething();
    Cache.Insert(personalCacheKey, myPersonalDataTable, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); // 30 minutes
}

// global (non user specific) cached item
string globalCacheKey = "MyDataTable";
DataTable globalDataTable = (DataTable)Cache[globalCacheKey];

if (globalDataTable == null)
{
    globalDataTable = database.dosomething();
    Cache.Insert(globalCacheKey, globalDataTable, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); // 30 minutes (again)
}

然而,您现在遇到的问题是基础数据是否得到更新,以及您的应用程序是否可以提供“旧”缓存数据。如果不可接受,则必须强制从缓存中删除一个项目,有一些机制。

您可以设置 SqlCacheDependency (我从未亲自使用过),或者您可以使用Cache.Remove(cachekey)自行清除缓存的对象。

答案 2 :(得分:3)

最好在存储器中存储“常用”数据;这是个好逻辑。但是,“会话”意味着它存在于该会话的生命周期中,因此也就是该用户。其次,正如您已经说过的那样,等待用户“会话”生活,这可能会占用服务器端的宝贵资源。

您可能要考虑使用的是“缓存”对象,因为它与“到期”的目的相同。

DataTable users = new DataTable();

if (Cache["users"] == null)
{
    // users = getUsers(customer);
   Cache.Add(“users”, users, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 60, 0), System.Web.Caching.CacheItemPriority.Default, null);
}
 else
{
    sers = (DataTable)Cache["users"];
}

在.NET中有很多方法可以重用内存 (1)ViewState (2)缓存 (3)会议 (4)饼干

但我会选择“缓存”对象。

答案 3 :(得分:2)

如果无法增加Web服务器上的内存,那么显而易见的答案是不将其存储在会话状态,并且每次都从数据库中获取它。

这个问题是它对您的数据库有什么影响?您是刚刚将问题从Web服务器移至数据库服务器吗?

扩展Web服务器要比扩展/扩展数据库容易得多(如果你使用像SQL Server这样的东西,通常会更便宜)

答案 4 :(得分:1)

如果您的数据表具有较少数量的记录且它不包含敏感数据,那么您也可以使用ViewState,但数据应该更小,因为此方法将序列化数据并将其存储在客户端,然后从客户端获取数据一边存放在服务器端。