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

rem*_*rem 17 database-design query database-recommendation

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

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

Lei*_*fel 10

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

DBMS_ALERT 支持数据库事件(警报)的异步通知。通过适当地使用这个包和数据库触发器,应用程序可以在数据库中感兴趣的值发生变化时通知自己。

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

  • @gbn 为什么没有帮助?我不能像你一样回答 SQL Server 部分,所以我回答了我能回答的部分。没有人是所有其他数据库的专家,但如果我们每个人都贡献我们的知识,OP 和未来的访问者将找到有用的信息。我希望 OP 接受 SQL Server 答案并投票支持其他有用的答案,例如 ScottCher 的 (+1)。 (9认同)

Nei*_*gan 8

听/通知 PostgreSQL

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

在数据库...

NOTIFY static_channel_name, 'static-message';
Run Code Online (Sandbox Code Playgroud)

或在函数/触发器中:

perform pg_notify('dynamic-channel-name', 'dynamic-message');
Run Code Online (Sandbox Code Playgroud)

在数据库客户端中:

LISTEN some_channel_name; --note the lack of quotes
Run Code Online (Sandbox Code Playgroud)

LISTEN 客户端将接收 PostgreSQL 进程 ID、通道名称和消息值。

PostgreSQL 的标准 JDBC 驱动程序不喜欢通知,但是您可以为此使用https://github.com/impossibl/pgjdbc-ng驱动程序


Gai*_*ius 7

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

另一种方法是首先通过像Tibco/RV这样的消息总线将数据路由到数据库中,然后简单地“分支”它,在流中进入数据库并进入您的应用程序,或者使用像Coherence这样的缓存层在您的应用程序和数据库之间。


gbn*_*gbn 5

SQL Server 2005+ 的服务代理可以做到这一点。

抱歉,我不确定其他 RDBMS

  • 您能否详细说明 Service Broker 如何做到这一点?@rem 询问是否从数据库中检索事件触发(而不是时间触发)更新。SB 用于排队和异步处理。 (2认同)

Sco*_*her 5

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

不知道任何其他 RDBMS。