目前我们正在使用Sessions在我们的页面中存储数据表,这样我们就不必再使数据库命中一次又一次地获取相同的数据表。但我担心的是它正在使用服务器内存,如果有一天大量用户登录,服务器的响应将变慢,我们的应用程序也可能崩溃。
请告诉我将数据表存储到Sessions中是个好主意还是我们每次都应该从DB获取数据表?
答案 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,但数据应该更小,因为此方法将序列化数据并将其存储在客户端,然后从客户端获取数据一边存放在服务器端。