Увеличение размера базы данных SQL Server

Я разрабатываю веб-приложение ASP.NET с функциями реального времени, используя ASP.NET SignalR.

Проблема, с которой я столкнулся, - это SqlNotificationType.

Если я использую SqlNotificationType.Change, я не могу получить уведомление об изменении из моей базы данных. SQL «ServiceBroker» включен для моей базы данных.

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
    if (e.Type == SqlNotificationType.Change)
    {
        NotificationHub nHub = new NotificationHub();
        nHub.SendNotifications();
    }
}

Но если я использую SqlNotificationType.Subscribe, он просто начинает уведомлять меня об изменениях в базе данных, но размер базы данных начинает расти с каждым изменением, внесенным в базу данных.

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
    if (e.Type == SqlNotificationType.Subscribe)
    {
        NotificationHub nHub = new NotificationHub();
        nHub.SendNotifications();
    }
}

Всякий раз, когда в таблицу базы данных вносятся изменения, необходимо создавать новую подписку путем повторного выполнения запроса после обработки каждого уведомления.

Увеличивает размер базы данных

Ниже представлена ​​функция отправки уведомлений всем подключенным клиентам.

public string SendNotifications()
    {
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MCNServerconnectionString"].ConnectionString))
        {
            const string query = "Select ID, AgentID, DiallerID, Call_Direction, Extension, Call_ID  from [MCNServer].[dbo].[CallsDataRecords] where ID = 915";
            connection.Open();

            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Notification = null;
                DataTable dt = new DataTable();

                SqlDependency dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                var reader = command.ExecuteReader();
                dt.Load(reader);

                if (dt.Rows.Count > 0)
                {
                    json = JsonConvert.SerializeObject(dt, Formatting.Indented);
                }
            }
        }
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
        return context.Clients.All.RecieveNotification(json).ToString();
    }

Решение, которое я нашел, состоит в том, чтобы уменьшить базу данных QueryNotificationTimeOut, чтобы истечь срок действия уведомлений.

Как аннулировать запись в кэше, чтобы исключить уведомления о запросах?


person Suhaib Janjua    schedule 29.06.2014    source источник


Ответы (1)


После долгих поисков и отладки моего кода я понял проблему и решил ее.

SqlNotificationType.Change не работал у меня, и когда я использовал SqlNotificationType.Subscribe, он работал у меня, но он увеличивался в зависимости от размера базы данных при подписке на уведомления о запросах, и срок их действия не истекал из-за несанкционированного доступа к базе данных.

Таким образом, проблема из-за размера базы данных увеличивалась, когда я использовал Sql Dependency и включил Service Broker для моей базы данных неавторизованный доступ к базе данных с пользователем sa.

Из-за этой проблемы срок действия уведомлений о запросах не истекает, и они добавляются в базу данных всякий раз, когда в базу данных вносятся изменения. Вот почему размер базы данных рос.

Поэтому, чтобы решить эту проблему, я изменяю свою базу данных и устанавливаю авторизацию для пользователя sa, и она работает нормально для меня.

ALTER AUTHORIZATION ON DATABASE::[MCNServer] TO [sa];

Теперь в базе данных не ожидается уведомления о запросе, поскольку пользователь sa теперь авторизован для доступа к этой базе данных, и я использую SqlNotificationType.Change, и теперь он работает.

person Suhaib Janjua    schedule 16.07.2014