2013-08-08 5 views
0

System ScopeНеобходимость установки SqlDependency каждого пользователя

У меня есть база данных с большим количеством пользователей (более 50000). В любой момент может быть зарегистрировано 100-200 человек и активно использовать систему. Система представляет собой ASP.NET MVC 4 с бэкэндом Sql Server 2008. Для доступа к данным мы используем Dapper.

Требования

Я пытаюсь создать компонент уведомлений, который имеет следующие атрибуты:

  1. Когда новая запись создается в [dbo.Assignment] таблицы (с OwnerId = [ В настоящее время вошедший в систему пользователь]), мне нужно обновить Cache внутри приложения 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, как я действительно никогда не требуется, чтобы использовать их до сегодняшнего дня. Очень возможно, что я упускаю из виду что-то важное.

ответ

0

Я действительно не использовал ни один из этих методов, но вот несколько альтернатив, которые вы можете создать сами, что сделает работу такой же хорошей.

Если вам нужно обновлять кеш каждый раз, когда новая запись вставляется в dbo. Таблица сопоставления, почему бы не создать событие OnInserted на вашем уровне доступа к данным, который будет уведомлять об обновлении объекта кэша?

Другое дело, что вы можете создать триггер INSERT в таблице Assignemt и другую таблицу, которая может выглядеть так: dbo.Cache (LastUpdate datetime). Триггер будет вставлять значение в таблицу Cache, и кеш приложения может пинговать эту таблицу, как каждый X минут или X секунд, чтобы узнать, требуется ли обновление кеша. Если вам нужно обновить кеш сразу после того, как вставлена ​​запись, триггеры могут быть чрезмерными, потому что вам придется пинговать таблицу кеша, вероятно, каждую секунду, но если у вас есть 200 онлайн-пользователей за раз, что, вероятно, не будет иметь большого значения в производительности БД.

Существует много работы, если вы хотите реализовать их для большого количества таблиц, но поскольку это только одна таблица, это может оказаться более быстрым способом, чем реализация встроенных механизмов кэширования.

+0

Я знаю об этих альтернативах, но я хотел бы иметь возможность, которая не предполагает опроса базы данных (поэтому я мог бы использовать что-то вроде SignalR в будущем). OnInsered, вероятно, хорошо, но может иметь много болтовни для 50 000 или более пользователей, которые не подключены к сети. Меня не волнует событие, если оно не входит в число зарегистрированных пользователей. – rodmjay

Смежные вопросы