System ScopeНеобходимость установки SqlDependency каждого пользователя
У меня есть база данных с большим количеством пользователей (более 50000). В любой момент может быть зарегистрировано 100-200 человек и активно использовать систему. Система представляет собой ASP.NET MVC 4 с бэкэндом Sql Server 2008. Для доступа к данным мы используем Dapper.
Требования
Я пытаюсь создать компонент уведомлений, который имеет следующие атрибуты:
- Когда новая запись создается в [dbo.Assignment] таблицы (с OwnerId = [ В настоящее время вошедший в систему пользователь]), мне нужно обновить Cache внутри приложения 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, как я действительно никогда не требуется, чтобы использовать их до сегодняшнего дня. Очень возможно, что я упускаю из виду что-то важное.
Я знаю об этих альтернативах, но я хотел бы иметь возможность, которая не предполагает опроса базы данных (поэтому я мог бы использовать что-то вроде SignalR в будущем). OnInsered, вероятно, хорошо, но может иметь много болтовни для 50 000 или более пользователей, которые не подключены к сети. Меня не волнует событие, если оно не входит в число зарегистрированных пользователей. – rodmjay