我正在开发一个ASP。. NET Web应用程序,具有实时功能。净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以使通知过期。
如何使缓存条目无效以消除查询通知?
经过大量的搜索和调试我的代码,我找到了问题并解决了。
SqlNotificationType.Change
不适合我,当我使用SqlNotificationType.Subscribe
时,它对我有效,但它通过订阅查询通知而增加数据库大小,并且由于未经授权访问数据库而未过期。
因此,由于数据库大小增加的问题,而我使用Sql依赖和启用服务代理为我的数据库是未经授权访问数据库与sa用户。
由于这个问题,查询通知不会过期,并且每当数据库中发生更改时,它们都会添加到数据库中。这就是为什么数据库的大小在增长。
所以为了解决这个问题,我修改了我的数据库并将授权设置为sa用户,它对我来说工作得很好。
ALTER AUTHORIZATION ON DATABASE::[MCNServer] TO [sa];
现在数据库中没有查询通知,因为sa
用户现在被授权访问该数据库,我使用SqlNotificationType.Change
,它现在正在工作