轮询是从数据库更新应用程序数据的唯一方法吗?


17

应用程序需要从数据库中获取尽可能新鲜的数据。在这种情况下,除了基于计时器的请求(轮询)数据库之外,还有其他获取数据的方法吗?

我使用MS SQL Server 2008(和.NET应用程序+实体框架),但是我也想了解其他类型的数据库。


Microsoft StreamInsight是专门为启用基于“数据事件”的处理而设计的。我对此了解不多,但是它看起来像一个完整且独立的平台,而不是SQL Server的单个功能。这是StreamInsight架构图
Nick Chammas 2012年

Answers:


5

SQL Server 2005+的Service Broker可以做到这一点。

抱歉,我不确定其他RDBMS


2
您能否详细说明Service Broker的工作方式?@rem正在询问有关从数据库中检索事件触发(而不是时间触发)的更新的问题。SB用于排队和异步处理。
Nick Chammas

1
-1 Service Broker似乎没有内置任何内容,可以让应用程序知道它已收到消息。(我目前在这个问题上一直处于困境。)
Vaccano

10

在Oracle中,您可以使用内置的DBMS_ALERT软件包来简化此操作。

DBMS_ALERT支持数据库事件的异步通知(警报)。通过适当使用此程序包和数据库触发器,只要数据库中感兴趣的值发生更改,应用程序就可以通知自己。

假设图形工具正在显示数据库表中某些数据的图形。在读取并绘制数据图形之后,图形工具可以等待覆盖刚刚读取的数据的数据库警报(WAITONE)。当任何其他用户更改数据时,该工具会自动唤醒。所需要做的就是将触发器放置在数据库表上,每当触发触发器时,该表就会执行一个信号(SIGNAL)。


对于“ OP SQL”问题是否需要“ MS SQL Server 2008”?他们要求其他RDBMS,但这实际上没有帮助。
gbn

9
@gbn为什么没有帮助?我无法像您那样回答SQL Server部分,所以我回答了我可以回答的部分。没有人是所有其他数据库的专家,但是如果我们每个人都贡献我们的知识,那么OP和未来的访问者会发现有用的信息。我希望OP接受SQL Server的答案,并投票赞成其他有用的答案,例如ScottCher的(+1)。
Leigh Riffel

说得好。阅读您的DBMS_ALERT答案后,我学习了另一种方法-用于工具箱的更多工具!+1
ScottCher 2011年

7

某些数据库供应商还提供集成的消息总线,您的应用程序可以简单地订阅这些消息总线:

另一种选择是首先通过消息总线(例如Tibco / RV)将数据路由到数据库中,然后简单地将其“分支”(在进入DB的流中,然后再进入应用程序的流),或使用诸如Coherence的缓存层在您的应用程序和数据库之间。


7

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驱动程序


5

另一个Oracle解决方案:我们使用Microsoft的dotnet框架开发了应用程序,这些应用程序利用了Oracle 的数据库更改通知功能以及ODP.Net(dotnet的Oracle数据提供者)。使用此功能,当新数据到达时,数据库实际上会通知dotnet应用程序,从而避免了持续轮询。我上面引用的链接是用于完成此操作的Oracle教程。希望这可以帮助你。

不知道其他任何RDBMS。


2

对于我们的一个应用程序(通过Chrome和ONLY Chrome访问),我们将MySQL与sys_exec UDF一起使用。基本上,为什么要使用Chrome-由于WebSocket支持。

一旦发生重要的更新/插入/删除操作,就会通过某些触发器中嵌入的新添加的sys_exec功能调用外部程序。到那时,我们已经具备了将消息中继到每个连接的客户端的全部功能,而无需进行轮询或多个查询,因为一切都是实时发生的。


1

我们结合使用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处理其中一种产品。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.