【问题标题】:Postgresql - detect changes and call webservicePostgresql - 检测更改并调用 web 服务
【发布时间】:2013-03-08 11:16:06
【问题描述】:

我有一个 PostgreSQL 数据库。我想要做的是,检测数据库中发生的任何更改(插入、更新),然后调用 web 服务。我怎么能这样做?

提前感谢您的帮助。

【问题讨论】:

标签: postgresql


【解决方案1】:

您应该能够使用触发器和listen/notify functionality in PostgreSQL 来实现这样的目标:

  1. 一组插入/更新/删除triggers 使用创建/更改/删除的 ID 作为有效负载,在表中发生任何更改时创建通知事件。

  2. 后台进程定期检查通知 (here's an example using Java/JDBC),然后从数据库加载更改的记录以进行 Web 服务调用。

这绝不是一个实时推送类型的系统,但您必须轮询数据库以获取通知事件以触发 web 服务调用。不过,它会成功的。

【讨论】:

  • 如果 Java 客户端不使用 SSL,它们可以只在客户端轮询通知。见jdbc.postgresql.org/documentation/publicapi/org/postgresql/…。如果您使用 SSL,则 PgJDBC 无法异步接收通知,您必须通过发送空查询或SELECT 1; 进行轮询。如果您使用客户端轮询,则可以非常快速地进行轮询,并且几乎是实时的。这适用于大多数语言的数据库驱动程序,而不仅仅是 PgJDBC。
  • 顺便说一句,使用LISTENNOTIFY 肯定是正确的方法。可以使用plpythonuplperlu 等触发器直接从数据库内部进行 Web 服务调用,但是 (a) 它不是事务性的,并且 (b) 它会对数据库的性能造成可怕的影响,尤其是如果网络服务很慢或没有响应。
  • 我建议不要将 ID 用作有效负载,而是将创建、插入和删除记录到历史表中,然后发送一个无有效负载的通知,告诉客户端某些事情已经发生添加到历史表中。更强大、更快。
  • 我已经安装了 PostgreSQL 8.4。我正在尝试将通知/侦听与触发器通知和 php 侦听一起使用。但是当我在表上插入一些东西时,它无法识别我在触发器启用的函数中使用的 pg_notify。是版本问题还是我做错了什么??
  • @diego10,哎哟。看起来 pg_notify 在 8.4 中不可用。您必须直接使用NOTIFY message,这不允许使用可变频道名称。此外,仅在 9.0 中添加了对有效负载的支持,因此您将不得不这样做。这使得@Craig 建议您最好使用历史记录表和通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多