7

我一直在做一些研究,我可以看到这个系统的大部分管道但是我不确定当表中的数据发生变化时,sql server 如何知道何时将消息发送回任何侦听器(应用程序)。我将首先解释我所理解的内容,直到我迷路为止。

1)需要在数据库上启用Service Broker,并且需要设置一些权限。

2)应该部署数据库模式。

3) 使用 aspnet_regsql.exe,为需要缓存数据的数据库和表启用 sql 缓存依赖项(此步骤创建一个表来跟踪更改并在表上触发以捕获更改并增加该表中的值)。

4)在.net应用中设置sql缓存依赖。例如,在 Web 应用程序中,您需要为轮询时间、连接字符串等添加配置值;在 global.asax.cs 中启动/停止依赖项,然后在将项目添加到缓存时添加 sql 缓存依赖项。

4a) 启动依赖项时发生的部分情况是,为队列、服务和存储过程设置了基础设施,以便之后进行通信和清理。使用 Sql Query Profiler,您可以看到正在建立连接并在服务上设置通信通道,以便应用程序接收来自 sql server 的消息。

5)这是我感到困惑的地方。此时,我已经在我的应用程序缓存中缓存了一个项目,其中引用了对基础表的 sql 缓存依赖项,以便我的应用程序可以在该行发生更改时接收更改。如果我在该行上手动运行更新,我可以看到触发器被命中,并且跟踪表中的值增加了 1。但是,我没有看到任何返回到应用程序的通信,在 sql 查询分析器上没有任何内容,也没有是从缓存中删除的项目。我也看不到数据库队列中的任何内容(动态应用程序队列和标准错误/传输队列都没有)

我的问题是,什么在监视数据库中的跟踪表,以便可以将消息发送回关注此数据更改的 sql 依赖项?

非常感谢任何帮助...我一直在搜索许多在线参考资料,但找不到任何具体的解释。

4

1 回答 1

5

在您的数据库中创建一个新表,其中包含您要检查更新的表的名称和更改编号。您为 sqldependency 设置的每个表都有一个为更新/插入设置的触发器,它增加了我刚刚描述的新表中的 changeid。

你对它如何运作的心智模型是倒退的。您的应用程序检查日志以确定表是否已更改。

因此,如果 changelog 表(这就是我所说的)正在跟踪数据库中的两个表(产品、用户),它将如下所示。

+Table Name + ChangeNumber +
| Product   | 1            |
+-----------+--------------+
| User      | 1            |
+-----------+--------------+

现在,如果您修改其中任何一个表中的任何内容,触发器将递增ChangeNumber,我们现在知道它们已更改。

显然还有更多,但这是一般的想法。

注意:应该注意,如果一个或多个表发生更改,您可以使页面无效,因此,如果您的页面为这两个表都设置了依赖关系,如果其中一个表发生更改,它将使缓存的页面无效并重新缓存更新的页面版本。

于 2011-09-08T19:55:11.577 回答