标签: sqldependency

SqlDependency Reliablity?

我目前的情况是,我有一个应用程序需要在新数据到达数据库表时得到通知.数据来自外部源(我无法控制 - 这是唯一的集成选项).当新数据到达时,我的应用程序需要采取某些操作 - 基本上查询新数据,处理它,将结果插入本地表等.

我希望尽可能避免轮询,因为预计数据会实时处理.也就是说,确保没有数据丢失是第一优先级.

我的问题:

  1. SqlDependency一般被认为是可靠的吗?
  2. 我是否需要关注竞争条件,例如我在另一个到来时处理一个变化?
  3. 数据库重启后会发生什么?我的应用程序是否会恢复并再次开始接收更改,或者我是否需要某种类型的故障安全计时器来定期重新订阅通知?
  4. 我在该主题上阅读的大多数文章都涉及SQL Server 2005.我使用的是SQL Server 2008 R2.是否有一种比SqlDependency更受欢迎的新技术?
  5. (编辑)此外,如果应用程序出现故障怎么办?我想我必须在启动时查询错过的数据?

c# sql-server sql-server-2008 sqldependency

43
推荐指数
2
解决办法
1万
查看次数

SqlDependency有什么限制

我使用表作为消息队列,并使用SqlDependency"注册"以获取更新.我读到的每个地方的人都在说要注意它的局限性,但没有具体说明它们是什么.从我收集的内容来看,当表具有非常高的更新频率时,你会遇到问题,幸运的是我只看到每分钟最多10-20个值.

对SqlServer有哪些其他限制/影响?

c# sql-server-2005 sqldependency

42
推荐指数
4
解决办法
3万
查看次数

SqlDependency随时间丢失订阅

我已经在.NET 3.5应用程序中使用SqlDependency超过3年没有任何问题.方案如下:

  1. 使用SqlDependency查看表的中央窗口服务(让我们称之为表A)
  2. 使用WPF应用程序的多个用户,每个用户观看一个表时具有唯一的SqlDependency(表A再次)
  3. 用户将一个工作单元排队,以便在表A中进行处理
  4. SqlDependency触发Windows服务
  5. Windows服务处理表A中的所有未完成项,并将结果保存到表A.
  6. 为结果可用的每个用户触发唯一的SqlDependency
  7. 用户处理他们的工作

最近我将系统升级到.NET 4.5,并开始看到将更改放入我们正在监视的表中的问题,但SqlDependency永远不会触发(在服务和用户应用程序中).我开始深入研究这一点,并在我的日志中注意到,在某些时候我会重新注册SqlDependency,但之后通知永远不会触发.

看到此行为后,我决定在SQL Server上运行探查器来捕获订阅事件.从捕获的数据中,我注意到有时订阅将由一个用户注册(具有唯一ID),但随后将由另一个用户触发(具有相同的唯一ID).这通常发生在我上面提到的服务和WPF应用程序的一个或多个用户身上.(我在分析器结果中附上了该问题的屏幕截图)

这是预期的行为吗?是否可以针对不同的用户触发通知?这是否指向应用程序层中的问题?任何帮助表示赞赏.

Profiler结果

c# sql-server-2008 sqldependency .net-4.5

41
推荐指数
1
解决办法
1657
查看次数

SqlDependency - 如何解释SqlNotificationEventArgs属性?

我正在使用SqlDependency类,并且一直尝试找不到SqlNotificationEventArgs对象的Type,SourceInfo属性的可能组合列表.

是迄今为止我发现的最接近的.但是,我知道这并不能涵盖所有内容,因为我已经看到了组合Change/Client/Error.

我真的很想知道我是否以最好的方式处理所有可能的情况.也就是说,只要有可能,我想重新建立"订阅".
例如,更改/客户端/错误是针对网络问题,该问题中断了SqlServer与我的应用之间的通信.一旦重新建立通信,我就能够成功恢复.

编辑:

如果我举一些关于我所担心的例子,也许会有所帮助.对于我说"恢复"时的以下问题,我的意思是在运行时重新建立订阅,即无需人工干预.

  • 是安全的假设类型Subscribe方法有什么我可以做恢复.
  • 它是安全的假设,一个来源Data总会有信息truncate,insert,update,或delete.如果不是,它将永远是类似的东西.我目前没有区分这些情况,我只是重新建立订阅并获取更新的数据.
  • 它是安全的假设,有可能是个例外信息Alter,一个来源object手段,我的查询不再有效,我将无法恢复.

c# sql-server-2005 sqldependency

24
推荐指数
1
解决办法
3308
查看次数

SQLDependency_OnChange-Event仅触发一次

我正在使用SQLDependency来通知我数据库是否有变化.程序启动后,它工作得很好.当我进行第一次更改时,事件会触发.Wohoo ......太好了.但如果我做了第二次更改,事件就不再发生了.我搜索了所有网络,但我没有发现任何有关此问题的信息.仅发现OnChange-Event在循环中触发的问题.谁能帮我?

这里有一小段代码:

private void GetStates()
    {
        if (!DoesUserHavePermission())
            return;

        SqlDependency.Stop(con);
        SqlDependency.Start(con);

        using (SqlConnection cn = new SqlConnection(con))
        {
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT Bla, Bla2, ..FROM dbo.[BLA3]"

                cmd.Notification = null;
                cmd.Dispose();

                SqlDependency dep = new SqlDependency(cmd);
                dep.OnChange += new OnChangeEventHandler(dep_OnChange);

                cn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    state.Clear(); //In this Case "state" is a List<string>
                    while (dr.Read())
                    {
                        state.Add(dr.GetString(0) + "|" + dr.GetInt32(3));
                    }
                    dr.Dispose();
                    dr.Close();
                }                    
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的OnChange-Event看起来像这样:

private …
Run Code Online (Sandbox Code Playgroud)

c# wpf sqldependency

22
推荐指数
3
解决办法
7480
查看次数

我希望我的数据库(SQL)通知或推送客户端应用程序的更新

我开发这个应用程序VB.net 2010SQL 2008.
我希望通知客户端有关db的更新,以及用于使用计时器检查db在指定分钟内的更改的应用程序,这实际上效率不高.我读到query notification,sqldependency,service broker,但后来我读到的东西,说他们可能不是有效的,如果我有100个客户,我使用查询通知推送通知我的申请.
有人会帮我解决我应该做的事情,以及如何做到这一点(如果可以提供示例,将会非常有用).提前致谢!

sql-server service-broker push-notification sqldependency query-notifications

21
推荐指数
1
解决办法
3万
查看次数

使用SQLDependency与定期轮询表(性能影响)

在我们的应用程序开发之初,我们非常重视SQLDependency来缓存数据库结果,直到通知告诉我们的应用程序获取新副本.

在测试期间,我们注意到sql db的性能受到sqldependency通知服务的影响.我们缩减了使用sqldependency的表的数量,并注意到性能的大幅提升.所以,我们认为我们刚刚过度使用它,我们继续前进.我们现在只有几张桌子.

后来我们发现我们无法缩减将建立依赖关系的用户名的安全访问级别.我们可以为每个db创建多个连接字符串(一个用于依赖,一个用于应用程序的其余部分)但是有多个db和db镜像,这很痛苦(从sql db管理角度和应用程序开发)

在这一点上,我们只是考虑基于以下逻辑完全脱离SQLDependency:

  1. 我们不需要数据发生变化的"即时"通知.如果我们在1秒钟内知道,那就足够快了.
  2. 通过一些轻微的重新分解,我们可以将其降低到只有1个表并每秒轮询该表一次.

有没有人看到这个逻辑的缺陷?

每秒轮询一个表会导致数据库上的负载比SQLDependency更多或更少吗?

是否有人与SQLDependency有类似的性能问题?

c# sql-server sqldependency

20
推荐指数
1
解决办法
7089
查看次数

让SqlChangeMonitor工作

我试图让System.Runtime.Caching命名空间中包含的新SqlChangeMonitor功能工作,并得到一些意想不到的结果.

我有一个简单的控制台应用程序设置为:

static void Main(string[] args)
{
    var cacher = new Cacher();

    cacher.Start();

    Console.WriteLine("Watching for changes...");

    while (true)
    {
        if (cacher.HasData)
        {
            Console.Write(".");
            Thread.Sleep(1000);
        }
        else
        {
            Console.WriteLine();
            Console.WriteLine("Cache EMPTY!");
            Console.ReadLine();
            cacher.Start();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cacher类定义为:

public class Cacher
{
    private MemoryCache cache = new MemoryCache("test");

    public Boolean HasData
    {
        get { return cache.Contains("data"); }
    }

    public void Start()
    {
        var connectionString = "Data Source=.;Initial Catalog=CachingTest;Integrated Security=True";
        var list = new NameValueCollection();
        var policy = new CacheItemPolicy();

        SqlDependency.Start(connectionString);

        using (var …
Run Code Online (Sandbox Code Playgroud)

.net caching sqldependency

14
推荐指数
1
解决办法
6276
查看次数

如何从SQL Server内存中清除SqlDependency?

如何清理SQL Server以清除过期的SqlDependency对象?从SqlDepedency对象收到事件后,我需要创建一个新事件才能获得新事件.但是,SQL Server进程的内存使用量会增加,直到超出允许的内存(SQL Server Express).如何摆脱旧查询?

码:

// Func: RegisterTableListener
using (SqlConnection cn = new SqlConnection(Properties.Settings.Default.DatabseEventConnectionString))
{
if (cmd == null)
{
    cmd = cn.CreateCommand();

    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT HostName, LastStatus, LastDetails, xml FROM dbo.[SystemTable]";
}

lock (cmd)
{
    cmd.Connection = cn;
    cn.Open();
    cmd.Notification = null;

    //  creates a new dependency for the SqlCommand
    if (dep == null)
        dep = new SqlDependency(cmd);
    //  creates an event handler for the notification of data
    //      changes in …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server-2008 sqldependency

12
推荐指数
1
解决办法
5266
查看次数

与EntityFramework 6的SqlDependency(异步)

我正在使用EF 6 async查询功能,例如

var list = await cx.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

我还想在这些查询上启动SQL依赖项,以便在数据库中的数据发生更改时收到通知.我可以使用System.Runtime.Remoting.Messaging.CallContext以下内容执行此操作:

    async Task GetData()
    {
        using (ClientsContext context = new ClientsContext()) // subclass of DbContext
        {

            SqlDependency.Start(context.Database.Connection.ConnectionString);
            SqlDependency dependency = new SqlDependency();
            dependency.OnChange += (sender, e) =>
                {
                    Console.Write(e.ToString()); 
                };

            System.Runtime.Remoting.Messaging.CallContext.SetData("MS.SqlDependencyCookie", dependency.Id);
            var list = await context.Clients.Where(c => c.FirstName.Length > 0).ToListAsync();
        }
    }
Run Code Online (Sandbox Code Playgroud)

..它工作正常.但是,如果我想要一个SqlDependency多个查询,我遇到了一个问题.如果我有两个async类似于GetData()上面的方法,并且我同时运行两个方法,则只有第一个方法会获得更改通知.我假设这是由于CallContext连续地为每个方法设置了cookie.如果我等待第一个async方法完成,然后调用第二个方法,它们都会按预期获得更改通知.这有什么解决方案吗?

c# asynchronous entity-framework sqldependency

11
推荐指数
1
解决办法
8948
查看次数