我正在使用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?
答案 0 :(得分:0)
经过大量搜索和调试我的代码,我找出了问题并解决了它。
SqlNotificationType.Change
对我不起作用,当我使用SqlNotificationType.Subscribe
时,它适用于我但通过订阅查询通知来增加数据库大小,它们是由于未经授权访问数据库而未过期。
因此,当我使用Sql Dependency并为我的数据库启用Service Broker时,由于数据库大小导致的问题正在增加未经授权访问sa用户的数据库。
由于此问题,查询通知不会过期,并且只要在数据库中进行更改,它们就会添加到数据库中。这就是数据库大小增长的原因。
因此,为了解决这个问题,我改变了我的数据库,并将授权设置为sa用户,并且对我来说工作正常。
ALTER AUTHORIZATION ON DATABASE::[MCNServer] TO [sa];
现在,数据库中没有待处理的查询通知,因为sa
用户现在有权访问此数据库并且我正在使用SqlNotificationType.Change
,现在它正在运行。