【发布时间】:2013-01-07 20:42:13
【问题描述】:
在我们的应用程序开发之初,我们大量使用 SqlDependency 来缓存数据库结果,直到通知告诉我们的应用程序获取一个新副本。
在测试期间,我们注意到 SQL DB 的性能受到 SqlDependency 通知服务的影响。我们缩减了使用 SqlDependency 的表的数量,并注意到性能有了很大的提高。所以,我们认为我们已经用完了它,我们继续前进。我们现在只剩下几张桌子了。
后来,我们发现我们无法缩减将建立依赖关系的用户名的安全访问级别。我们可以为每个 DB 设置多个连接字符串(一个用于依赖项,一个用于应用程序的其余部分),但是对于多个 DB 和 DB 镜像,这是一种痛苦(从 SQL DB 管理员和应用程序开发的角度来看)。
此时,我们只是考虑完全基于以下逻辑摆脱 SqlDependency:
- 我们不需要“即时”通知数据已更改。如果我们在 1 秒内知道,那已经足够快了。
- 通过一些轻微的重构,我们可以将其缩减为仅 1 个表并每秒轮询该表一次。
有人看到这个逻辑有缺陷吗?
与 SqlDependency 相比,每秒轮询一个表会导致更多或更少的数据库负载吗?
有人遇到过类似的 SqlDependency 性能问题吗?
【问题讨论】:
-
您的投票将如何检测到发生了变化?触发器?
-
作为侧边栏;我从未使用过这项技术,但您可能会发现它很有用:msdn.microsoft.com/en-us/library/ms130764(v=sql.105).aspx
-
我认为没有人试图回答这个问题是一种恭维。
-
两者都做怎么样?即,使用触发器填充标志汇总表,然后对汇总表使用 SQLDependency?
-
@bjan 我们结束了使用相同的理念实现 memcached,它对我们来说效果很好。我们有 memcached 分布在 4 台服务器上,每台服务器都有一个作业来轮询数据库中的指定表。如果他们找到一条记录,他们会尝试删除该记录。无论哪个服务器成功删除了记录,该服务器都会使用新的数据副本更新 memcached(从指定表中删除的记录具有表名和 ID 号)。我们在其数据将被缓存的表上使用触发器,以在作业轮询的指定表中输入记录。
标签: c# sql-server sqldependency