我正在尝试为我的网络应用程序创建数据访问层。目前,所有数据表都存储在会话中。当我完成后,DAL将填充并返回数据表。将返回的数据表存储在会话中是一个好主意吗?分布式/共享缓存?或者每次只ping数据库?注意:通常,数据表中的行数将是小的< 2000。
其他信息:
几乎没有数据共享。发送到SQL查询的参数由用户选择。用户可用的参数值取决于用户是谁。在大多数情况下,两个用户不可能运行相同的SQL查询。但是,同一个用户可以多次运行同一个查询。
更多信息: 并发用户数~50,000
重要信息: 在99%的情况下,没有两个用户将拥有相同的数据/查询,但是,同一个用户可以运行相同的查询/多次获取相同的数据。
由于
答案 0 :(得分:4)
将数据存储在会话中并不是一个好主意,因为:
我建议将数据表存储在Cache中,并且只在第一次请求时填充每个表而不是一次填充所有表。这样,如果IIS开始回收缓存中的空间,则代码不会受到影响。
按需提取的非常简单的示例:
T GetCached<T>(string cacheKey, Func<T> getDirect) {
object value = HttpContext.Current.Cache.Item(cacheKey);
if(value == null) {
value = getDirect();
HttpContext.Current.Cache.Insert(cacheKey, value);
}
return (T) value;
}
编辑: - 问题更新
缓存与本地会话 - 本地会话状态是全有或全无。如果它太满,IIS将回收其中的所有内容。相比之下,当内存过低时,缓存项会被单独删除,因此问题就更少了。
缓存与会话状态服务器 - 我没有任何数据支持这个,所以如果我错了就请说出来,但我想在每个物理服务器AppDomain中独立缓存数据比将其存储在共享会话状态服务中更好。
答案 1 :(得分:1)
在Application
或Cache
对象中存储查找/词典 - 以及您的应用经常需要的项目;查询数据库以获取取决于用户角色的数据。
<强> - 编辑 - 强>
这是对你的评论的回应。
通常在任何面向数据的系统中,查询围绕事实表(或不可避免要查询的表)运行;假设您有一个 set 不可避免的表,那么您可以使用Cache.Insert()
:
如果您没有任何性能问题,请让SQL处理所有内容。
答案 2 :(得分:1)
我要说的第一件事是:缓存在任何地方都不是强制性的。您应该明智地使用它,特别是与数据访问相关的瓶颈。
我不认为在任何地方存储1000个不同的数据表和2000条记录是个好主意。如果查询是如此动态,以至于在短时间内具有相同的查询是异常,那么缓存似乎不是一个好的选择。
关于分布式缓存选项,我建议您检查http://memcached.org。世界各地许多大型项目使用的分布式缓存。
我知道Velocity已经接近了,但到目前为止我知道它需要Windows Server 2008,而且它还是非常新的东西。通常,Microsoft产品从版本2.0开始很好:-)
答案 3 :(得分:0)
在Session
中存储这些数据是一个非常糟糕的主意。每个用户都将获得自己的版本!
如果这是共享数据(对所有用户都相同),请考虑将其移至Application
对象。