【发布时间】:2015-09-05 06:27:00
【问题描述】:
我有一个表格,它有大约 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]
现在想象一下,如果这个表有一百万行,它真的会减慢这个过程。
【问题讨论】:
-
你控制着作者吗?只是因为理想情况下,这类事情应该以不同的方式完成,而不是使用超过数百万条记录的
SqlDependency,而是更接近作者或使用一些发布/订阅机制。 -
并非如此。但是考虑触发器是有道理的。每天晚上我都可以截断通过触发器填充的表。你怎么看?
-
我认为这是一个不错的选择,具有足够的灵活性,可以让您以最适合您目标的方式构建和管理数据提取表。我看你不喜欢他们,我想我明白原因,但在这种情况下,他们可能没问题。
标签: signalr sqldependency