使用Session来存储Datatable

Usm*_*lid 4 c# memory asp.net session

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

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

Sco*_*ttS 7

作为一般的经验法则,我会说不要使用会话.我没有必要使用会话很长一段时间.一旦进入Web场,会话会变慢或者更复杂或两者兼而有之.

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

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


Mat*_*hew 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)
}
Run Code Online (Sandbox Code Playgroud)

但是,您现在遇到的问题是底层数据是否已更新,以及您的应用程序是否可以提供"旧"缓存数据.如果不可接受,则必须强制从缓存中删除一个项目,这有一些机制.

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