我有一个表,它有大约100万行。此表由Web服务,CMS应用程序和其他来源更新。我想监视此表中的几列。我读到了SignalR和SqlDependency
。
然而,在每次更改时,SqlDependency似乎重新扫描整个表格?我的桌子非常大,我无法在每次更改时重新扫描数据库。
唯一的解决方案是使用 Trigger 还是什么?我真的想远离触发器。
以下是代码:
public IEnumerable<JobInfo> GetData()
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(
@"SELECT [JobID],[Name],[LastExecutionDate],[Status]
FROM [dbo].[JobInfo]", connection))
{
// Make sure the command object does not already have
// a notification object associated with it.
command.Notification = null;
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
using (var reader = command.ExecuteReader())
return reader.Cast<IDataRecord>()
.Select(x => new JobInfo(){
JobID = x.GetInt32(0),
Name = x.GetString(1),
LastExecutionDate = x.GetDateTime(2),
Status = x.GetString(3) }).ToList();
}
}
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
JobHub.Show();
}
示例中的查询是......
SELECT [JobID],[Name],[LastExecutionDate],[Status]
FROM [dbo].[JobInfo]
现在想象一下,如果这个表有一百万行,那真的会减慢这个过程。
答案 0 :(得分:0)
您可以在命令查询中添加一些条件以进行过滤,例如-
SELECT [JobID],[Name],[LastExecutionDate],[Status]
FROM [dbo].[JobInfo]
WHERE [LastExecutionDate] > @lastExecutionDate
然后使用-
设置参数command.Parameters.Add(new SqlParameter("lastExecutionDate", SqlDbType.DateTime) { Value = DateTime.Now.ToUniversalTime() });
这样,您将仅在LastExecutionDate字段晚于上次注册SqlDependency的时间时收到通知(至少用于插入/更新)。