【发布时间】:2009-12-30 20:43:53
【问题描述】:
我正在编写一个 C++ 控制台应用程序,它需要响应数据库表的特定字段的变化。尽管我可以继续发送查询以定期检查该字段,但我想避免这种情况,因为该应用程序的多个实例可能正在运行。我听说过 SQL Server 2005 的查询通知功能,但似乎该功能不适用于我的设置(SQL Server 2000)。在这种情况下,实现此功能的最佳方法是什么?
【问题讨论】:
标签: java c++ sql-server
我正在编写一个 C++ 控制台应用程序,它需要响应数据库表的特定字段的变化。尽管我可以继续发送查询以定期检查该字段,但我想避免这种情况,因为该应用程序的多个实例可能正在运行。我听说过 SQL Server 2005 的查询通知功能,但似乎该功能不适用于我的设置(SQL Server 2000)。在这种情况下,实现此功能的最佳方法是什么?
【问题讨论】:
标签: java c++ sql-server
您只能定期轮询更改。绝对没有办法从 SQL Server 2000 获得通知。所有相反的说法都是白日做梦。
通过 OLE 自动化(sp_oa 方法)、通过扩展过程、通过 xp_cmdshell 或任何类似的方式执行任何类型的外部通知的触发器都不起作用。首先是性能问题:您希望数据库做的最后一件事是阻止触发器等待外部进程响应。其次,在事务环境中通常会忽略正确性的小细节:如果封闭事务回滚,则在触发器期间发送的任何通知都必须“未发送”。实现这一点的唯一方法是使用通知机制(例如 MSMQ)注册分布式事务,这意味着吞吐量从每秒数百/数千下降到个位数。
不要去那里。升级到 SQL 2005 并使用 QN,这是唯一的主动更改通知机制。或者满足于定期轮询最近的更改。
【讨论】:
我会这样做。
您的控制台应用程序负责检查表中特定列的值何时在该列的任何位置发生更改(更新、删除、插入等)。
第 1 步 - 不要将控制台应用程序指向数据库,创建一个 MSMQ 并让它看起来在那里
第 2 步 - 创建第二个控制台应用程序,其唯一工作就是向上述 MSMQ 写入值
第 3 步 - 在相关表上创建一个触发器,以从第 2 步执行控制台应用程序。
【讨论】:
我认为通知服务本身可以在 SQL Server 2000 上运行。
看看这些文章:
希望这会有所帮助。
【讨论】:
我认为你应该为此使用触发器。
当表字段发生变化时,触发器被触发并使用任何 IPC 机制通知其他应用程序或在注册表或临时文件中写入必要的信息。
【讨论】: