Я разрабатываю веб-приложение 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, чтобы истечь срок действия уведомлений.
Как аннулировать запись в кэше, чтобы исключить уведомления о запросах?