目前我们正在使用 Sessions 在我们的页面中存储数据表,这样我们就不必一次又一次地访问数据库来获取相同的数据表。但我担心的是它正在使用服务器内存,如果有一天大量用户登录,服务器的响应会变慢,我们的应用程序也可能会崩溃。
请告诉我将数据表存储到 Sessions 中是个好主意,还是我们应该每次都从数据库中获取数据表?
作为一般经验法则,我会说不要使用会话。我已经很长时间没有使用会话了。一旦您进入网络农场情景会话,要么变得慢很多,要么变得更复杂,或者两者兼而有之。
您是否会侥幸成功取决于您在会话中存储了多少数据,以及在会话超时期限内将有多少用户处于活动状态。
今天有很多可用的缓存和内存数据库选项可能是更好的选择。最后,虽然所描述的解决方案听起来有问题,但在您实际测量问题之前,我不会优化现有解决方案。
这取决于数据表中存储的内容。无论如何,出于以下原因,我会使用ASP.NET 缓存来存储这些数据表。
缓存有过期时间,这意味着您可以根据滑动或绝对过期时间值自动删除它
如果进程内存“压力”太高,缓存将自动删除。
您可以使缓存项特定于一个用户,或根据其键对所有用户全局
例如:
// 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)
.
最好将“常用”数据存储在内存中;这是很好的逻辑。但是,“会话”意味着它在该会话的生命周期中存在,因此在该用户的生命周期中存在。其次,正如您已经说过的,等待用户“会话”的生命,这可能会消耗服务器端的宝贵资源。
您可能要考虑使用的是“缓存”对象,因为它与“过期”具有相同的目的。
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) Cache (3) Session (4) Cookies
但我会选择“缓存”对象。
如果您无法增加 Web 服务器上的内存,那么显而易见的答案是不要将其存储在会话状态中并每次都从数据库中获取它。
问题是它会对您的数据库产生什么影响?您只是将问题从 Web 服务器转移到数据库服务器吗?
扩展 Web 服务器比扩展/扩展数据库要容易得多(如果您使用 SQL Server 之类的东西,通常会更便宜)
如果您的数据表的记录数量较少并且不包含敏感数据,那么您也可以使用 ViewState 但数据应该更小,因为这种方法会将数据序列化并将其存储在客户端,然后从客户端获取数据进行存储在服务器端。