Answers:
SQL Server 2005+的Service Broker可以做到这一点。
抱歉,我不确定其他RDBMS
在Oracle中,您可以使用内置的DBMS_ALERT软件包来简化此操作。
DBMS_ALERT支持数据库事件的异步通知(警报)。通过适当使用此程序包和数据库触发器,只要数据库中感兴趣的值发生更改,应用程序就可以通知自己。
假设图形工具正在显示数据库表中某些数据的图形。在读取并绘制数据图形之后,图形工具可以等待覆盖刚刚读取的数据的数据库警报(WAITONE)。当任何其他用户更改数据时,该工具会自动唤醒。所需要做的就是将触发器放置在数据库表上,每当触发触发器时,该表就会执行一个信号(SIGNAL)。
某些数据库供应商还提供集成的消息总线,您的应用程序可以简单地订阅这些消息总线:
另一种选择是首先通过消息总线(例如Tibco / RV)将数据路由到数据库中,然后简单地将其“分支”(在进入DB的流中,然后再进入应用程序的流),或使用诸如Coherence的缓存层在您的应用程序和数据库之间。
PostgreSQL的监听/通知
http://www.postgresql.org/docs/current/static/sql-notify.html
在数据库中...
NOTIFY static_channel_name, 'static-message';
或在函数/触发器中:
perform pg_notify('dynamic-channel-name', 'dynamic-message');
在数据库客户端中:
LISTEN some_channel_name; --note the lack of quotes
LISTEN客户端将收到PostgreSQL进程ID,通道名称和消息值。
PostgreSQL的标准JDBC驱动程序不喜欢通知,但是您可以为此使用https://github.com/impossibl/pgjdbc-ng驱动程序
对于我们的一个应用程序(通过Chrome和ONLY Chrome访问),我们将MySQL与sys_exec UDF一起使用。基本上,为什么要使用Chrome-由于WebSocket支持。
一旦发生重要的更新/插入/删除操作,就会通过某些触发器中嵌入的新添加的sys_exec功能调用外部程序。到那时,我们已经具备了将消息中继到每个连接的客户端的全部功能,而无需进行轮询或多个查询,因为一切都是实时发生的。
我们结合使用Oracle GoldenGate和Java Persistence API(JPA)对Oracle数据库进行此操作,还对DB2,Sybase,Microsoft SQL Server,MySQL,Teradata等进行此操作。此处描述了该功能:http:// docs .oracle.com / middleware / 1212 / coherence / COHIG / golden_g.htm
GoldenGate的作用是将数据库事务日志转换为可过滤的事件流,该事件流可在网络的任何位置使用。我们使用它将相关事务转换为缓存更新或缓存无效,这两者都可以触发应用程序级事件,例如,将数据一直推送到桌面或HTML5 Websocket应用程序。
(要进行全面披露,我在Oracle上使用GoldenGate处理其中一种产品。)