0

我有一个 PostgreSQL 服务器,每当某个表上发生更新时,我都需要运行一些代码。PostgreSQL 触发器(使用 PL/java)允许我调用静态 java 方法。我需要执行的方法使用有关更新内容的信息对外部服务器执行 RPC。

我想不通的是如何创建一个跨调用持续存在的全局资源(在这种情况下,是与外部服务器的网络连接)。

一种方法可能是为全局资源创建一个静态变量。当我的触发器方法第一次被调用时,初始化这些变量。在随后的调用中,只需使用它。这会起作用吗,还有其他方法吗?

我会喜欢的是一个可以为我的触发器实现的通用触发器接口。

4

2 回答 2

3

即使你这样做了——它只会在给定的会话中是“全局的”——而不是在许多会话中。

但是 - 重点是没有实际意义的,因为在我看来,方法是错误的。

而不是添加连接到外部系统的触发器,我更愿意:

  1. 创建使用NOTIFY通知更改的触发器
  2. 添加LISTEN用于通知并执行远程工作的应用程序。
于 2011-12-23T14:23:58.923 回答
0

根据 depesz 的回答,以及在互联网上进行的更多搜索 - 这是针对我的情况的最佳解决方案:

客户有办法发出LISTEN xyz;向服务器声明。然后NOTIFY xyz; 可以在服务器发出语句,并通知客户端。xyz用于识别发生了什么。该NOTIFY语句还允许与它一起发送“有效负载”(仅在 PostgreSQL 9+ 上支持,目前是最新版本)。

一个合理的实现是根据表的更新关联一个触发器。该触发器向客户端发出一条NOTIFY语句,并且有效负载包含更新的行数据。

这种实现有一个缺点 - JDBC 驱动程序(连接到 PostgreSQL 服务器的 java 接口)不支持真正的异步行为。侦听器必须发出一个虚拟查询以连接到后端(更新 - 不需要虚拟查询:http: //goo.gl/VbFQg。但仍在轮询),只有这样所有待处理的通知才会传递给客户端。另请注意,SQL 的 LISTEN/NOTIFY 扩展仅特定于 PostgreSQL,而不是 SQL 标准的一部分。

参考:PostgreSQL 的 NOTIFY 文档监听/通知的 JDBC 文档页面

于 2011-12-24T10:02:24.980 回答