rem Asked: 2011-03-05 10:31:57 +0800 CST2011-03-05 10:31:57 +0800 CST 2011-03-05 10:31:57 +0800 CST 轮询是从数据库更新应用程序数据的唯一方法吗? 772 应用程序需要尽可能从数据库中更新最新的数据。在这种情况下,除了基于计时器的请求(轮询)数据库之外,还有其他获取数据的方法吗? 我使用 MS SQL Server 2008(和 .NET 应用程序 + 实体框架),但我也想了解其他类型的数据库。 database-design database-recommendation 7 个回答 Voted Leigh Riffel 2011-03-05T11:57:59+08:002011-03-05T11:57:59+08:00 在 Oracle 中,您可以使用内置的DBMS_ALERT 包来促进这一点。 DBMS_ALERT 支持数据库事件(警报)的异步通知。通过适当使用此包和数据库触发器,应用程序可以在数据库中感兴趣的值发生更改时通知自己。 假设图形工具正在显示数据库表中某些数据的图形。图形工具可以在读取数据并将其绘制成图形后,等待覆盖刚刚读取的数据的数据库警报 (WAITONE)。当任何其他用户更改数据时,该工具会自动唤醒。所需要的只是在数据库表上放置一个触发器,该触发器在触发时执行一个信号 (SIGNAL)。 Neil McGuigan 2013-01-23T11:07:14+08:002013-01-23T11:07:14+08:00 听/通知 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驱动程序 Gaius 2011-03-05T15:07:07+08:002011-03-05T15:07:07+08:00 某些数据库供应商还提供您的应用程序可以简单地订阅的集成消息总线: Oracle 高级队列 IBM DB2 与 MQseries(现在称为 WebSphere MQ) Sybase RTMS 另一种方法是首先通过像Tibco/RV这样的消息总线将数据路由到数据库中,然后简单地“分支”它,在流中进入 DB 并进入您的应用程序,或者使用像Coherence这样的缓存层在您的应用程序和数据库之间。 ScottCher 2011-03-05T12:15:39+08:002011-03-05T12:15:39+08:00 另一个 Oracle 解决方案:我们使用 Microsoft 的 dotnet 框架开发了应用程序,该框架利用了 Oracle 的数据库更改通知功能以及 ODP.Net(dotnet 的 Oracle 数据提供程序)。使用它,数据库实际上会在新数据到达时通知 dotnet 应用程序,从而避免不断轮询。我在上面引用的链接是用于执行此操作的 Oracle 教程。希望这可以帮助你。 不知道任何其他 RDBMS。 Best Answer gbn 2011-03-05T11:03:42+08:002011-03-05T11:03:42+08:00 SQL Server 2005+ 的Service Broker可以做到这一点。 抱歉,我不确定其他 RDBMS Furicane 2011-03-09T09:59:35+08:002011-03-09T09:59:35+08:00 对于我们的一个应用程序(通过 Chrome 和仅 Chrome 访问),我们将 MySQL 与sys_exec UDF一起使用。基本上,为什么是 Chrome - 由于 WebSocket 支持。 一旦发生关键更新/插入/删除,就会通过嵌入在某些触发器中的新添加的 sys_exec 功能调用外部程序。那时,我们已经拥有了将消息中继到每个连接的客户端所需的一切,而无需轮询或多次查询,因为一切都是实时发生的。 cpurdy 2014-06-04T14:44:13+08:002014-06-04T14:44:13+08:00 我们结合使用 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。)
在 Oracle 中,您可以使用内置的DBMS_ALERT 包来促进这一点。
听/通知 PostgreSQL
http://www.postgresql.org/docs/current/static/sql-notify.html
在数据库中...
或在函数/触发器中:
在数据库客户端中:
LISTEN 客户端将收到 PostgreSQL 进程 ID、通道名称和消息值。
PostgreSQL 的标准 JDBC 驱动程序不喜欢通知,但是您可以为此目的使用https://github.com/impossibl/pgjdbc-ng驱动程序
某些数据库供应商还提供您的应用程序可以简单地订阅的集成消息总线:
另一种方法是首先通过像Tibco/RV这样的消息总线将数据路由到数据库中,然后简单地“分支”它,在流中进入 DB 并进入您的应用程序,或者使用像Coherence这样的缓存层在您的应用程序和数据库之间。
另一个 Oracle 解决方案:我们使用 Microsoft 的 dotnet 框架开发了应用程序,该框架利用了 Oracle 的数据库更改通知功能以及 ODP.Net(dotnet 的 Oracle 数据提供程序)。使用它,数据库实际上会在新数据到达时通知 dotnet 应用程序,从而避免不断轮询。我在上面引用的链接是用于执行此操作的 Oracle 教程。希望这可以帮助你。
不知道任何其他 RDBMS。
SQL Server 2005+ 的Service Broker可以做到这一点。
抱歉,我不确定其他 RDBMS
对于我们的一个应用程序(通过 Chrome 和仅 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。)