系统范围
我有一个包含很多用户(超过 50,000 个)的数据库。任何时候都可能有 100-200 人登录并积极使用该系统。该系统是 ASP.NET MVC 4,带有 Sql Server 2008 后端。对于数据访问,我们使用 Dapper。
要求
我正在尝试构建一个具有以下属性的通知组件:
- 在 [dbo.Assignment] 表中创建新记录时(使用 OwnerId = [当前登录的用户]),我需要更新 asp.net 应用程序中的缓存。
- 我不想收到不活跃在线用户的任何通知,因为这会浪费大量资源)
具体问题:
我应该使用 SqlDependency、SqlCacheDependency 还是 SqlNotification?
假设我们正在使用 SqlDependency,当用户注销时,我将如何删除 Dependency.OnChange 处理程序。
任何代码示例都将不胜感激,因为这已经花费了我一天的时间来试图弄清楚。
这是当前代码
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 的经验,因为直到今天我才真正需要使用它们。我很可能忽略了一些重要的事情。