我不太熟悉数据库及其在 CRUD 操作之外提供的功能。

我的研究让我 触发器. 。基本上看起来触发器提供了这种类型的功能:

(从 维基百科)

通常有三种触发事件会导致触发器“触发”:

  • INSERT 事件(当新记录被插入数据库时​​)。
  • UPDATE 事件(当记录被更改时)。
  • DELETE 事件(当删除记录时)。

我的问题是:当使用某种触发器语义更新/删除/插入记录时,有什么方法可以通过数据库在 Java 中通知我(最好包括更改的数据)?

这个问题可能有哪些替代解决方案?如何监听数据库事件?

我想这样做的主要原因是这样的场景:

我有 5 个客户端应用程序,它们都位于不同的进程中/存在于不同的 PC 上。它们都共享一个公共数据库(本例中为 Postgres)。

假设一个客户端更改了数据库中所有 5 个客户端都“感兴趣”的记录。我正在尝试想办法让客户“通知”更改(最好附加受影响的数据),而不是在某个时间间隔查询数据。

有帮助吗?

解决方案

使用 Oracle,您可以在表上设置触发器,然后让触发器发送 JMS 消息。Oracle 有两种不同的 JMS 实现。然后,您可以拥有一个使用 JDBC 驱动程序“侦听”消息的进程。我已经使用这种方法将更改推送到我的应用程序与其他应用程序中。轮询。如果您使用的是 Java 数据库 (H2),您还有其他选项。在我当前的应用程序 (SIEM) 中,我在 H2 中有触发器,可以使用 JMX 发布更改事件。

其他提示

不要混淆数据库(包含数据)和该数据上的事件。

触发器是一种方式,但通常您的应用程序中会有一个持久层。该层可以选择在某些事情发生时触发事件 - 比如 JMS 主题。

触发器是最后一搏,因为您正在操作关系项,而不是数据上的“事件”。(例如,“更新”实际上可以映射到“公司更改法定名称”事件)如果您依赖数据库,则必须将插入和更新映射回现实生活事件......你已经知道了!

然后,您可以在这些通知之上分层其他内容(例如事件流处理),以查找其他人感兴趣的事件。

詹姆士

唔。那么您正在使用 PostgreSQL 并且希望“监听”事件并在事件发生时收到“通知”?

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

希望这可以帮助!

从数据库调用外部进程是非常特定于供应商的。

就在我的头顶上:

  • SQLServer可以从触发器调用CLR程序,

  • PostgreSQL可以调用任意C函数动态加载,

  • MySQL可以调用任意C函数,但必须将其编译为

  • Sybase如果设置为此可以进行系统调用。

最简单的做法是让插入/更新/删除触发器在某个日志表中创建一个条目,并让您的 java 程序监视该表。日志表中最好包含 EVENT_CODE、LOG_DATETIME 和 LOG_MSG 等列。

除非您需要非常高的性能或需要处理 100K 条记录,否则这可能就足够了。

我认为你混淆了两件事。它们都是高度特定于数据库供应商的。

第一个我将称之为“触发器”。我确信至少有一个数据库供应商认为触发器与此不同,但请耐心等待。触发器是可以附加到表的服务器端代码段。例如,您可以对表 X 中的每个更新运行 PSQL 存储过程。有些数据库允许您使用真正的编程语言编写这些内容,而其他数据库则只能使用其 SQL 变体。触发器通常相当快且可扩展。

另一个我称之为“事件”。这些是在数据库中触发的触发器,允许您在客户端程序中定义事件处理程序。IE,只要客户端数据库有更新,就在程序中触发 updateClientsList。例如,使用 python 和 firebird 请参阅 http://www.firebirdsql.org/devel/python/docs/3.3.0/beyond-python-db-api.html#database-event-notification

我相信之前使用监视器的建议是使用其他数据库实现这一点的等效方法。也许是甲骨文?另一个答案中提到的 MSSQL 通知服务也是另一个实现。

我什至想说你最好真正知道为什么你希望数据库通知你的客户端程序,否则你应该坚持使用服务器端触发器。

您要问的问题完全取决于您正在使用的数据库以及您用于与数据库通信的框架。

如果您使用 Hibernate 之类的东西作为持久层,它有一组侦听器和拦截器,您可以使用它们来监视进出数据库的记录。

根据您使用的数据库,这里有一些不同的技术。一种想法是轮询数据库(我确信您正在努力避免这种情况)。基本上你可以经常检查更改。

另一种解决方案(如果您使用的是 SQL Server 2005)是使用通知服务,尽管这项技术据称已在 SQL 2008 中被取代(我们还没有看到纯粹的替代品,但 Microsoft 已经公开讨论过)。

如果您正在使用 Oracle,请查看此 上一篇文章.

这通常是标准客户端/服务器应用程序的用途。如果所有插入/更新/删除都经过服务器应用程序,然后服务器应用程序修改数据库,那么客户端应用程序可以更容易地发现所做的更改。

如果你使用 postgresql 它有能力监听 通知 来自 JDBC 客户端。

我建议使用上次更新的时间戳列,以及可能更新记录的用户,然后让客户端根据持久记录的时间戳检查其本地记录时间戳。

在我看来,添加回调/触发功能所增加的复杂性是不值得的,除非得到数据库后端和所使用的客户端库的支持,例如为与 ADO.NET 一起使用的 SQL Server 2005 提供的通知服务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top