postgresql - java - 当数据库中发生某些事情时唤醒应用程序

Posted

技术标签:

【中文标题】postgresql - java - 当数据库中发生某些事情时唤醒应用程序【英文标题】:postgresql - java - wake up application when something in database happens 【发布时间】:2011-11-10 10:52:15 【问题描述】:

我编写了一个 Java 应用程序,当数据库中发生“某些事情”时应该启动或唤醒它。例如,插入用户表应该触发通常的欢迎邮件、密码、...邮件的发送。

执行此操作的最佳常见做法是什么?我可以编写我的应用程序,使其每秒执行以下查询:

select mail from user where mail_sent = false

但这是轮询,我想避免它。有没有办法启动或唤醒由数据库更改启动的 Java 应用程序(推送)?

干杯!

【问题讨论】:

重要信息:我只想要一个 Java 应用程序实例。因此,如果两个用户一个接一个地添加,我不想启动第二个实例。也就是说,动作由单个实例顺序处理。 【参考方案1】:

PostgreSQL 中的触发器可以用多种语言编写,其中包括 PL/Java。您可以在需要监视相关操作(插入、删除、更新...)的表上设置触发器,并让触发器处理通知。它可能需要某种形式的进程间通信,但如果触发器和客户端都是用 Java 编写的,那应该不会太难。

【讨论】:

【参考方案2】:

看看NOTIFY

【讨论】:

非常有用。一个缺点似乎是我们仍然必须根据jdbc.postgresql.org/documentation/83/listennotify.html 进行 POLL:“JDBC 驱动程序的一个关键限制是它无法接收异步通知,并且必须轮询后端以检查是否发出了任何通知。” 这里的意思是 '后端'?我们是每 x 秒查询一次数据库还是访问内存中的 JDBC 后端? 是的,后端是指数据库。是的,监听器偶尔会轮询数据库以查看它是否收到通知。如果您想要实际的异步事件,可以查看 Firebird。 根据 pgsql 的文档,它们是异步的。只有 JDBC 驱动有不支持异步更新的限制。我猜这可能是他们路线图上的一个 TO DO。【参考方案3】:

试试这个..它很容易理解,对你有很大帮助

https://wiki.postgresql.org/wiki/PgNotificationPoller

【讨论】:

【参考方案4】:

我认为无法启动应用程序。但是,当您运行应用程序时,该应用程序可以订阅以侦听事件。您可以使用触发器发布(通知)特定操作的事件。

当应用程序收到事件通知时,它可以响应某些操作。请参阅postgresql site for an example。

【讨论】:

在代码中多个位置监听多个事件时,帮助器实现非常有用。谢谢!

以上是关于postgresql - java - 当数据库中发生某些事情时唤醒应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 7 的应用程序安装程序中捆绑 PostgreSQL

如何在 postgresql 中使用 postgres_fdw 从另一个数据库中获取记录

Java连接PostgreSQL数据库

Java连接PostgreSQL数据库

Java连接PostgreSQL数据库

谷歌云应用引擎到 postgresql 连接被拒绝