DAL,会话,缓存架构

时间:2010-04-21 16:56:29

标签: c# asp.net architecture data-access-layer

我正在尝试为我的网络应用程序创建数据访问层。目前,所有数据表都存储在会话中。当我完成后,DAL将填充并返回数据表。将返回的数据表存储在会话中是一个好主意吗?分布式/共享缓存?或者每次只ping数据库?注意:通常,数据表中的行数将是小的< 2000。

其他信息:

几乎没有数据共享。发送到SQL查询的参数由用户选择。用户可用的参数值取决于用户是谁。在大多数情况下,两个用户不可能运行相同的SQL查询。但是,同一个用户可以多次运行同一个查询。

更多信息: 并发用户数~50,000

重要信息: 在99%的情况下,没有两个用户将拥有相同的数据/查询,但是,同一个用户可以运行相同的查询/多次获取相同的数据。

由于

4 个答案:

答案 0 :(得分:4)

将数据存储在会话中并不是一个好主意,因为:

  1. 每个用户都获得相同数据的单独副本 - 极大地浪费了服务器内存。
  2. 如果您填充了太多数据,IIS将回收会话。
  3. 我建议将数据表存储在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)

ApplicationCache对象中存储查找/词典 - 以及您的应用经常需要的项目;查询数据库以获取取决于用户角色的数据。

<强> - 编辑 -

这是对你的评论的回应。

通常在任何面向数据的系统中,查询围绕事实表(或不可避免要查询的表)运行;假设您有一个 set 不可避免的表,那么您可以使用Cache.Insert()

  1. 在应用启动时加载不可避免的表格;
  2. 在表请求的基础上在Cache中加载大多数查询的表;
  3. 查询最少查询表的数据库。
  4. 如果您没有任何性能问题,请让SQL处理所有内容。

答案 2 :(得分:1)

我要说的第一件事是:缓存在任何地方都不是强制性的。您应该明智地使用它,特别是与数据访问相关的瓶颈。

我不认为在任何地方存储1000个不同的数据表和2000条记录是个好主意。如果查询是如此动态,以至于在短时间内具有相同的查询是异常,那么缓存似乎不是一个好的选择。

关于分布式缓存选项,我建议您检查http://memcached.org。世界各地许多大型项目使用的分布式缓存。

我知道Velocity已经接近了,但到目前为止我知道它需要Windows Server 2008,而且它还是非常新的东西。通常,Microsoft产品从版本2.0开始很好:-)

答案 3 :(得分:0)

Session中存储这些数据是一个非常糟糕的主意。每个用户都将获得自己的版本!

如果这是共享数据(对所有用户都相同),请考虑将其移至Application对象。