我有一个PostgreSQL服务器,每当某个表上发生更新时我都需要运行一些代码。 PostgreSQL触发器(使用PL / java)允许我调用静态java方法。我需要执行的方法使用有关更新内容的信息对外部服务器执行RPC。
我无法弄清楚的是我如何创建一个全局资源(在这种情况下,与外部服务器的网络连接),这些资源在调用过程中持续存在。
一种方法可能是为全局资源创建静态变量。当我第一次调用我的触发器方法时,初始化这些变量。在后续的电话中使用它。这会有效,还有其他方法吗?
我所喜欢的是一个通用的触发界面,我可以为我的触发器实现。
答案 0 :(得分:3)
即使你这样做 - 它只会在给定的会话中“全局” - 而不是在多个会话中。
但是 - 这一点没有实际意义,因为,正如我所看到的那样,它的方法是错误的。
而不是添加连接到外部系统的触发器,我宁愿:
答案 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 PostgreSQL,JDBC documentation page for listen/notify