【发布时间】:2013-03-08 11:16:06
【问题描述】:
我有一个 PostgreSQL 数据库。我想要做的是,检测数据库中发生的任何更改(插入、更新),然后调用 web 服务。我怎么能这样做?
提前感谢您的帮助。
【问题讨论】:
标签: postgresql
我有一个 PostgreSQL 数据库。我想要做的是,检测数据库中发生的任何更改(插入、更新),然后调用 web 服务。我怎么能这样做?
提前感谢您的帮助。
【问题讨论】:
标签: postgresql
您应该能够使用触发器和listen/notify functionality in PostgreSQL 来实现这样的目标:
一组插入/更新/删除triggers 使用创建/更改/删除的 ID 作为有效负载,在表中发生任何更改时创建通知事件。
后台进程定期检查通知 (here's an example using Java/JDBC),然后从数据库加载更改的记录以进行 Web 服务调用。
这绝不是一个实时推送类型的系统,但您必须轮询数据库以获取通知事件以触发 web 服务调用。不过,它会成功的。
【讨论】:
SELECT 1; 进行轮询。如果您使用客户端轮询,则可以非常快速地进行轮询,并且几乎是实时的。这适用于大多数语言的数据库驱动程序,而不仅仅是 PgJDBC。
LISTEN 和NOTIFY 肯定是正确的方法。可以使用plpythonu、plperlu 等触发器直接从数据库内部进行 Web 服务调用,但是 (a) 它不是事务性的,并且 (b) 它会对数据库的性能造成可怕的影响,尤其是如果网络服务很慢或没有响应。
NOTIFY message,这不允许使用可变频道名称。此外,仅在 9.0 中添加了对有效负载的支持,因此您将不得不这样做。这使得@Craig 建议您最好使用历史记录表和通知。