Postgresql 如何创建Java客户端应用程序。can";捕获;(通过JDBC)触发器过程查询产生的结果?

Postgresql 如何创建Java客户端应用程序。can";捕获;(通过JDBC)触发器过程查询产生的结果?,postgresql,jdbc,triggers,callback,resultset,Postgresql,Jdbc,Triggers,Callback,Resultset,我试图理解通过JDBC与pgSQL数据库(服务器)通信的java(客户机)应用程序如何“捕获”查询生成的结果,该查询将在记录插入表时触发(使用触发器) 因此,为了澄清这一点,我通过JDBC安装了一个触发器过程,准备在将记录插入给定的数据库表时执行查询,并且从该查询的执行将产生一个输出(我想是封装在resultSet中)。我的问题是,我不知道客户端如何知道这些异步生成的结果 我想知道JDBC是否支持任何“回调”机制,能够捕获在“INSERT INTO table”条件下通过触发器过程触发的查询产生

我试图理解通过JDBC与pgSQL数据库(服务器)通信的java(客户机)应用程序如何“捕获”查询生成的结果,该查询将在记录插入表时触发(使用触发器)

因此,为了澄清这一点,我通过JDBC安装了一个触发器过程,准备在将记录插入给定的数据库表时执行查询,并且从该查询的执行将产生一个输出(我想是封装在resultSet中)。我的问题是,我不知道客户端如何知道这些异步生成的结果

我想知道JDBC是否支持任何“回调”机制,能够捕获在“INSERT INTO table”条件下通过触发器过程触发的查询产生的结果。如果没有这种“回调”机制,那么实现这一结果的最佳方法是什么


提前感谢:)

触发器无法返回结果集

无法将这样的结果发送给JDBC驱动程序

有一些肮脏的黑客可以用来从触发器向客户端获取结果,但它们都是如此。例如:

  • 为结果集声明一个游标,然后将游标名称作为
    通知
    有效负载发送,这样应用程序就可以
    获取所有内容

  • 创建一个
    临时表
    并通过
    通知

更典型的做法是,将触发器与应用程序通信所需的任何内容附加到为此目的而存在的表中,并在触发触发器的操作运行后让应用程序
从中选择


在大多数情况下,如果您需要这样做,您可能会使用一个触发器,其中常规函数更适合使用。

据我所知,不是这样。触发器完全在数据库服务器的上下文中运行,JDBC不知道。这在很大程度上是一种请求/响应习惯用法,而不是双向套接字通信。因此,为了澄清这一点,pgSQL数据库没有“标准”(无解决方法)机制可用于通知客户端应用程序(用java编写)数据库模式中可能发生的“某些事情”,对吗?数据库和它们的客户机只能通过客户机-服务器模式进行通信,数据库不可能为它们的客户机向后推送事件,对吗?客户总是负责轮询数据库,以便了解他们的数据发生了什么。@DiogoAnjos这正是
LISTEN
NOTIFY
的目的。它们不是SQL标准,但在PostgreSQL中常用。这就是为什么我在上面提到了
NOTIFY
。PgJDBC中支持接收通知。请参阅所提供链接上PostgreSQL LISTEN and NOTIFY的.Note:“JDBC驱动程序的一个关键限制是它无法接收异步通知,必须轮询后端以检查是否发出了任何通知。”因此它也是轮询,这里没有引入推送机制(@MGM有点像。如果您不使用SSL,PgJDBC可以避免轮询。它仍然需要执行非阻塞套接字读取,但不需要执行客户端/服务器往返。