线程,事件和数据库

时间:2013-05-12 16:10:52

标签: c# sql multithreading events

好的,所以我对数据库不太熟悉,所以可能有一个我不知道的简单解决方案。

我有一个SQL数据库,由我的c#应用程序中的类管理。我希望该类做的是不断检查数据库以查看是否有新数据。如果有新数据,我希望它触发另一个类将要监听的事件。现在我猜我需要实现一个线程,它将在每隔一个ms或其他什么时候检查数据库。但是,为了解雇我的活动,我需要寻找什么?当有新条目时,数据库是否可以通知班级?

3 个答案:

答案 0 :(得分:0)

如果您使用的是MS SQLServer,则可以使用.NET Framework中的SqlDependency类来获取有关数据库更改的通知。

也许其他数据库系统在其数据库驱动程序包中具有类似的机制。

如果由于某种原因无法使用它,则需要一个Thread来定期轮询数据库。

答案 1 :(得分:0)

除了使用SqlDependency之外,如果您使用带有Timer对象的ASP.NET或MVC,则可以使用SqlCacheDependencyCache。不推荐1ms间隔,因为您可能不会在下一次启动之前完成检查,因此您的数据库负载会非常高。您还可以确保使用Timer.AutoReset属性,这样您就不会有相互绊倒的电话。

编辑2:This MSDN example显示了如何使用SqlDependency,包括Enable Query Notifications (MSDN)。使用SqlDependency有很多注意事项,例如它实际上是为创建有限观察者的Web服务器而设计的,而不是桌面应用程序,所以请记住这一点。有一篇关于BOL的好文章称为Planning for Notifications,强调查询通知很有用

  

如果查询中的数据相对不经常更改,如果应用程序在数据更改时不需要即时更新,并且查询符合创建通知查询中列出的要求和限制

在您的示例中,您建议需要1毫秒的延迟,因此,依赖类可能不是最适合您的方式(另请参阅我后来对您的延迟要求的评论)。

编辑:例如(使用计时器):

class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer(1);
        timer.Elapsed += timer_Elapsed;
        timer.AutoReset = false;
        timer.Enabled = true;
    }

    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Timer timer = (Timer)sender;
        try
        {
            //  do the checks here
        }
        finally
        {
            //  re=enable the timer to check again very soon
            timer.Enabled = true;
        }
    }
}

至于要检查的内容,取决于您实际要检测的更改。以下是一些想法:

  • 表行计数(但如果自上次检查后添加和删除行,则会很危险)
  • 表id列的最大值(仅当您的数字标识字段正在增加时才有效,并且仅用于检查新行)
  • 检查各列是否有您要观看的特定行的更改
  • 在列中使用行CHECKSUM来检查各行的更改
  • 要求作者使用您可以检查的更改参考ID更新单独的表
  • 使用审计表记录更改,并检查新的审计记录

在获得对此的良好答案之前,您需要更好地定义变更监控的范围。

<强>延迟

还要问问自己,您是否确实需要1毫秒的更新延迟更新。如果你这样做,一个完全不同的方法可能会更好。例如,您可能需要使用数据编写者对应用程序中需要知道已发生更新的部分的通知机制立即

答案 2 :(得分:0)

1.如果您希望数据库通知您的应用程序有关更改,那么您可以使用Broker(首先启用数据库以支持Brokers,然后编写一些代码以“附加”Broker。)。对于您的应用程序,您将需要SqlDependency类。

有用的链接: Enable Broker

Query Notifications in SQL Server

如果你想检查多个查询,那么请注意Broker有点haevy。

2.如果您希望您的应用程序完成所有工作,您必须创建一个函数来检查所选表的CKECKSUM,每次保留最后一个校验和,如果您发现任何差异,那么您将“点击” “获取新数据的数据库。

你必须决定谁将完成你所有的工作! 希望能帮助到你。