SQL Server数据库大小增加

时间:2014-06-29 14:08:36

标签: asp.net sql-server signalr signalr-hub sqldependency

我正在使用ASP.NET SignalR开发具有实时功能的ASP.NET Web应用程序。

我面临的问题是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以使通知失效。

如何使缓存条目无效以消除querynotifications?

1 个答案:

答案 0 :(得分:0)

经过大量搜索和调试我的代码,我找出了问题并解决了它。

SqlNotificationType.Change对我不起作用,当我使用SqlNotificationType.Subscribe时,它适用于我但通过订阅查询通知来增加数据库大小,它们是由于未经授权访问数据库而未过期。

因此,当我使用Sql Dependency并为我的数据库启用Service Broker时,由于数据库大小导致的问题正在增加未经授权访问sa用户的数据库。

由于此问题,查询通知不会过期,并且只要在数据库中进行更改,它们就会添加到数据库中。这就是数据库大小增长的原因。

因此,为了解决这个问题,我改变了我的数据库,并将授权设置为sa用户,并且对我来说工作正常。

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

现在,数据库中没有待处理的查询通知,因为sa用户现在有权访问此数据库并且我正在使用SqlNotificationType.Change,现在它正在运行。