0

系统范围

我有一个包含很多用户(超过 50,000 个)的数据库。任何时候都可能有 100-200 人登录并积极使用该系统。该系统是 ASP.NET MVC 4,带有 Sql Server 2008 后端。对于数据访问,我们使用 Dapper。

要求

我正在尝试构建一个具有以下属性的通知组件:

  1. 在 [dbo.Assignment] 表中创建新记录时(使用 OwnerId = [当前登录的用户]),我需要更新 asp.net 应用程序中的缓存。
  2. 我不想收到不活跃在线用户的任何通知,因为这会浪费大量资源)

具体问题:

  1. 我应该使用 SqlDependency、SqlCacheDependency 还是 SqlNotification?

  2. 假设我们正在使用 SqlDependency,当用户注销时,我将如何删除 Dependency.OnChange 处理程序。

  3. 任何代码示例都将不胜感激,因为这已经花费了我一天的时间来试图弄清楚。

这是当前代码

 public IList<Notification> GetNotifications(string userName)
        {
            Cache o = HttpContext.Current.Cache;
            if (o["Notifications_" + userName] == null)
            {
                var notifications = new List<Notification>();
                using (var cn = new SqlConnection(getSQLString()))
                {
                    using (var cmd = cn.CreateCommand())
                    {
                        var parameter = new SqlParameter("Employee_Cd", SqlDbType.Char, 30) { Value = userName };

                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandText = "Notifications.Assignments";
                        cmd.Parameters.Add(parameter);
                        cmd.Notification = null;

                        var dependency = new SqlCacheDependency(cmd);

                        cn.Open();
                        using (var dr = cmd.ExecuteReader())
                        {
                            // this is where you build your cache
                            while (dr.Read())
                            {
                                var obj = new Notification();
                                obj.Name = dr["Name"].ToString();
                                notifications.Add(obj);
                            }
                            dr.Close();
                        }

                        HttpContext.Current.Cache.Insert("Notifications_" + userName,
                            notifications,
                            dependency,
                            DateTime.Now.AddDays(1D),
                            Cache.NoSlidingExpiration);
                    }
                }
            }
            return (List<Notification>) o["Notifications_" + userName];           
        }

注意:我没有使用 SqlDependencies 的经验,因为直到今天我才真正需要使用它们。我很可能忽略了一些重要的事情。

4

1 回答 1

0

我并没有真正使用这些技术中的任何一种,但这里有一些你可以自己创建的替代方法,它们同样可以很好地完成这项工作。

如果每次将新记录插入 dbo.Assignment 表时都需要更新缓存,为什么不在数据访问层创建 OnInserted 事件来通知缓存对象刷新?

您可以做的另一件事是在 Assignemt 表和另一个看起来像 dbo.Cache (LastUpdate datetime) 的表中创建 INSERT 触发器。触发器会将值插入缓存表,并且您的应用程序缓存可以每隔 X 分钟或 X 秒 ping 该表,以查看是否需要更新缓存。如果您需要在插入记录后立即刷新缓存,则触发器可能是一种矫枉过正,因为您可能必须每秒 ping 缓存表,但如果您一次有 200 个在线用户,这可能不会有太大的不同数据库性能。

如果你想为很多表实现这些,需要做很多工作,但由于这只是一个表,这可能比实现内置缓存机制更快。

于 2013-08-08T10:43:28.743 回答