我正在开发一个基于Windows的MFC应用程序,使用PostgreSQL来执行
- 从UI获取信息
- 执行一些逻辑并将相关信息存储到数据库
- 存储的信息必须立即或按计划间隔(例如在xyz日期的5:00)通过网络发送
目前,我们已经开发了一种调度器机制(线程),它不断地轮询数据库中插入的新信息。线程获取信息并发送给网络模块。
但是,我觉得这不是正确的方法
- 每次轮询都是开销。有时候没有什么可执行的
- 这不是实时的,因为我们每5秒轮询一次
-
是否有办法发送一个触发器到我的网络模块,只要信息在数据库中更新?
-
或者有更好的方法来完成这个任务吗?
你可以使用PostgreSQL的listen/notify特性。
- http://www.postgresql.org/docs/current/static/sql-listen.html
- http://www.postgresql.org/docs/current/static/sql-notify.html
对消息感兴趣的客户端将执行listen
语句,然后触发器将notify
它们。
我没有使用c#,但根据手册,你可以以异步方式检索消息——这仍然涉及一些"轻量级"轮询,因为通知消息只作为服务器回答的一部分发送。手册声称运行一个"空"语句(如;
)就足够了。使用Java/JDBC时,我使用了一个简单的select 42
,它不会给服务器带来很大的工作负载,因为没有触及任何表。
这个轮询绝对比实际检索表的数据更快,更具可伸缩性。
是的,你是对的@RDX,你不应该每次都轮询它,而应该在Postgres中编写一个触发器,并从该触发器尝试调用java程序,可以在下面的线程中看到。
从Postgres触发器调用java pgm