Service Broker 外部激活器响应需要很长时间
Service Broker External Activator response take long
我在 SQL Server 2014 上有两个数据库,SourceDB
和 LogDB
。在 SourceDB 上,Service Broker
;在服务器上,Service Broker External Activator
服务已激活。
在 SourceDB 上,我有 TargetQueue,其中 table 的(产品)插入触发器在 TargetQueue 上发送更改,而 TargetQueue 有事件通知,它推动我的外部 exe 客户端。在 exe 客户端中,我最终通过 WAITFOR(RECEIVE TOP (1))..
将数据出列并将它们直接记录到 LogDB。
所以,当我启动 SBEA 服务并第一次插入 table a/a 几条记录(删除所有记录后)时,TargetQueue 立即填满,但从插入到 SourceDB 的时间间隔直到插入 LogDB 大约 3-6 秒 ,我猜这里基于事件通知的时间消耗,不确定。对于此后的进一步插入,间隔变为 100ms,如下所示。
第一
进一步
- 为什么第一次插入耗时太长,为什么删除table的所有记录后,又变得耗时?为什么,更多的比第一个更短?
- 我能否将间隔减少到 10 毫秒以下,因为我可以在 10 毫秒以下实现与 SQLCLR 几乎相同的结构,而且最快的响应对我的应用程序也很重要? (两个结构都在相同的 SQL 服务器实例在本地工作)
您可以通过放弃外部激活器和事件通知来简化流程。而是让你的程序连续 运行 WAITFOR (RECEIVE 直接在循环中的目标队列上。
这是一个让您入门的示例:https://code.msdn.microsoft.com/Service-Broker-Message-e81c4316
我在 SQL Server 2014 上有两个数据库,SourceDB
和 LogDB
。在 SourceDB 上,Service Broker
;在服务器上,Service Broker External Activator
服务已激活。
在 SourceDB 上,我有 TargetQueue,其中 table 的(产品)插入触发器在 TargetQueue 上发送更改,而 TargetQueue 有事件通知,它推动我的外部 exe 客户端。在 exe 客户端中,我最终通过 WAITFOR(RECEIVE TOP (1))..
将数据出列并将它们直接记录到 LogDB。
所以,当我启动 SBEA 服务并第一次插入 table a/a 几条记录(删除所有记录后)时,TargetQueue 立即填满,但从插入到 SourceDB 的时间间隔直到插入 LogDB 大约 3-6 秒 ,我猜这里基于事件通知的时间消耗,不确定。对于此后的进一步插入,间隔变为 100ms,如下所示。
第一
进一步
- 为什么第一次插入耗时太长,为什么删除table的所有记录后,又变得耗时?为什么,更多的比第一个更短?
- 我能否将间隔减少到 10 毫秒以下,因为我可以在 10 毫秒以下实现与 SQLCLR 几乎相同的结构,而且最快的响应对我的应用程序也很重要? (两个结构都在相同的 SQL 服务器实例在本地工作)
您可以通过放弃外部激活器和事件通知来简化流程。而是让你的程序连续 运行 WAITFOR (RECEIVE 直接在循环中的目标队列上。
这是一个让您入门的示例:https://code.msdn.microsoft.com/Service-Broker-Message-e81c4316