从数据库获取事件

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

我的研究使我找到了触发因素。基本上,触发器看起来提供了这种类型的功能:

(来自维基百科)

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

  • INSERT 事件(当新记录插入到数据库中时)。
  • 更新事件(当记录正在更改时)。
  • 删除事件(因为正在删除记录)。

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

此问题有哪些替代解决方案?如何侦听数据库事件?

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

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

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


答案 1

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


答案 2

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

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

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

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

詹姆斯