postgresql触发器 - 定义全局资源(java)

时间:2011-12-23 11:17:29

标签: database postgresql triggers pljava

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

我无法弄清楚的是我如何创建一个全局资源(在这种情况下,与外部服务器的网络连接),这些资源在调用过程中持续存在。

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

我所喜欢的是一个通用的触发界面,我可以为我的触发器实现。

2 个答案:

答案 0 :(得分:3)

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

但是 - 这一点没有实际意义,因为,正如我所看到的那样,它的方法是错误的。

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

  1. 创建使用NOTIFY通知有关更改的触发器
  2. 为通知添加LISTEN的应用程序并执行远程作业。

答案 1 :(得分:0)

基于depesz的回答,以及一些在互联网上搜索的内容 - 这是我情况的最佳解决方案:

客户有办法发布LISTEN xyz;声明到服务器。然后是NOTIFY xyz;语句可以在服务器上发出,并通知客户端。 xyz用于识别发生的事情。 NOTIFY语句还允许随身携带“有效载荷”(仅支持PostgreSQL 9+,截至目前为止的最新版本。)

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

此实现有一个缺点 - JDBC驱动程序(连接到PostgreSQL服务器的Java接口)不支持真正的异步行为。监听器必须发出一个虚拟查询来连接到后端(更新 - 不需要虚拟查询:http://goo.gl/VbFQg。仍然轮询),然后只有所有挂起的通知都将被传递给客户端。另请注意,SQL的LISTEN / NOTIFY扩展仅适用于PostgreSQL,并且不属于SQL标准。

参考文献:NOTIFY documentation for PostgreSQLJDBC documentation page for listen/notify