如何:通知应用程序数据库表行已更新?

Posted

技术标签:

【中文标题】如何:通知应用程序数据库表行已更新?【英文标题】:HowTo: Inform application that database table row is updated? 【发布时间】:2013-01-04 09:13:10 【问题描述】:

我正在开发一个基于 MFC 的基于 Windows 的应用程序,使用 PostgreSQL 来执行

    从 UI 获取信息 执行一些逻辑并将相关信息存储到数据库中 必须立即或按计划间隔(例如 xyz 日期的 5:00)通过网络发送存储的信息

目前,我们开发了一种调度机制(线程),它不断地轮询数据库以获取数据库中插入的新信息。线程获取信息并发送到网络模块。

但是,我觉得这不是正确的方法

    每次轮询都是开销。有时可能没有什么可以执行 这不是实时的,因为我们每 5 秒轮询一次

所以

    有没有办法在数据库中更新信息后立即向我的网络模块发送触发器?

    或者有什么更好的方法来完成这个任务?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以为此使用 PostgreSQL 的侦听/通知功能。

http://www.postgresql.org/docs/current/static/sql-listen.html http://www.postgresql.org/docs/current/static/sql-notify.html

对消息感兴趣的客户端将执行listen 语句,然后触发器将notify 他们。

我不使用 C#,但是根据the manual,您可以以异步方式检索消息 - 这仍然涉及一些“轻量级”轮询,因为通知消息仅作为服务器答案的一部分发送.该手册声称运行“空”语句(例如;)就足够了。使用 Java/JDBC 我使用了一个简单的select 42,它不会给服务器带来很大的工作量,因为没有触及任何表。

这种轮询肯定比实际检索表的数据更快且更具可扩展性。

【讨论】:

【参考方案2】:

是的@RDX,你是对的,你不应该每次都轮询它,而是你可以在 Postgres 中编写一个触发器,然后从该触发器尝试调用可以在下面的线程中看到的 java 程序。

Calling java pgm from Postgres trigger

【讨论】:

我放了一个java程序,因为我知道java。同样,如果您的应用程序在 Windows 上,肯定会有一个调用 C# 程序的进程。 并且还想知道还有一个过程可以生成通知 IPC,即进程间通信说某些行得到了 modifield ... 来源:Link 可以从基于MFC的应用程序中调用吗? 该应用程序是基于windows MFC对话框的应用程序,当然它使用MVC模式。 怎么样?你能分享一些信息吗

以上是关于如何:通知应用程序数据库表行已更新?的主要内容,如果未能解决你的问题,请参考以下文章

仅当行已更改时,MySQL 才在更新后触发

SQL如何用一条SQL语句更新表行

StaleObjectStateException:行已被另一个事务更新或删除?

如何使用php更新mysql表中的特定表行[重复]

打字稿:如何在对象更改时使用动态表行更新表

如何用新数据正确覆盖 SQLite 表行?