Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用会话存储数据表_C#_Asp.net_Session_Memory - Fatal编程技术网

C# 使用会话存储数据表

C# 使用会话存储数据表,c#,asp.net,session,memory,C#,Asp.net,Session,Memory,目前,我们正在使用会话在页面中存储数据表,这样我们就不必一次又一次地点击数据库来获取相同的数据表。但我担心的是,它正在使用服务器内存,如果有一天有大量用户登录,服务器的响应会变慢,我们的应用程序也可能崩溃 请告诉我将数据表存储到会话中是一个好主意,还是我们应该每次都从DB获取数据表?作为一般经验法则,我会说不要使用会话。我已经很长时间没有使用会话了。一旦您进入web服务器场情况会话,要么会变得慢得多,要么会变得复杂得多,要么两者兼而有之 您是否能够成功,实际上取决于您在会话中存储了多少数据,以及

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


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

作为一般经验法则,我会说不要使用会话。我已经很长时间没有使用会话了。一旦您进入web服务器场情况会话,要么会变得慢得多,要么会变得复杂得多,要么两者兼而有之

您是否能够成功,实际上取决于您在会话中存储了多少数据,以及在会话超时期间有多少用户处于活动状态

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

最好将“常用”数据存储在内存中;这是很好的逻辑。然而,“会话”意味着它在该会话的生命周期内存在,因此该用户也存在。其次,正如您已经说过的,等待用户“会话”生命周期,这可能会消耗服务器端的宝贵资源

您可能想使用的是“Cache”对象,因为它与“到期”的目的相同。

在.NET中有许多方法可以重用内存 (1) 视图状态 (2) 缓存 (3) 会议 (4) 饼干


但是我会选择“Cache”对象。

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

问题是它会对数据库产生什么影响?您是否正在将问题从web服务器转移到数据库服务器


扩展web服务器要比扩展/扩展数据库容易得多(如果使用SQL Server之类的工具,通常更便宜)

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

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

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

  • 可以使缓存项特定于一个用户,也可以基于其密钥使其全局化

例如:

// 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)清除缓存对象

如果数据表的记录数较少,且不包含敏感数据,则也可以使用ViewState,但数据应较小,因为此方法将序列化数据并将其存储在客户端,然后从客户端获取数据并存储在服务器端

这是一个伟大的观点。在WebFarm中,我们肯定会遇到问题。但我们不打算搬到农场去。这对我们来说是个好消息。有什么流行的会话替代方案吗?最简单、最明显的替代方案是使用asp.net缓存,正如其他答复所建议的那样。请记住,如果您不能接受缓存数据中的某些不一致性,则asp.net缓存在web场中也会很麻烦。更重要的解决方案包括memcached,或者redis和一系列其他类似技术。我怀疑你不需要一个繁重的解决方案,因为你的问题可能已经足够明显,你不需要问它是否是一个问题。这是一个很好的例子。但我担心的是缓存仍然会使用服务器的内存,如果是Web服务器场,这个选项会成功吗?+1。缓存用于缓存,会话用于每个用户的数据(同样在使用内存会话状态的情况下,应该准备好,由于服务器重新启动/回收,该数据将消失,…)。是的,缓存在WebFarm场景中也可以很好地缓存共享数据。对于web farm,有分布式缓存系统可以处理特定于它们的问题。我担心缓存仍会使用服务器的内存,如果是web farm,此选项会成功吗?是的,但很明显,这取决于缓存中存储了多少数据。我们使用它来简单的东西,如客户姓名,用户名等。替代地,您可以考虑一些类似于MimcCurrase.NET版本和Linux版本-无论您喜欢什么。如果您的数据很大,其他的选择是使用Redis、CouchBase或类似的工具。
// 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)
}