2

如果我有 2 个进程在不同的节点上运行并且它们共享一个数据库,那么是否存在一个节点能够通过数据库向另一个进程发送一些通知的模式?
通常使用某种轮询表还是有更好的方法?

4

5 回答 5

3

而不是轮询(这意味着不仅会消耗 CPU 周期,而且在这种情况下还会消耗数据库资源和带宽),这个怎么样?如果您使用的是 Oracle,则可以为要通知的表定义一个触发器 ON UPDATE 并从触发器中调用 Java 存储过程 (JSP)。然后,JSP 可以使用任何通知机制来通知其他组件有关更改。这不会非常快,但是...

正确的方法是让更新数据库的组件向其他组件发送并行通知,并再次为此 RMI、JMS 等使用任何可用技术

于 2012-12-12T16:24:17.773 回答
2

如果要使用数据库,可以在生产端将条目插入到表中,然后轮询以在消费端查找新条目。这可能是您项目中最简单的选择。

有许多可能的替代方案,例如 JMI、RMI、Sockets、NoSql 数据库、文件,但是如果没有更多信息,就无法判断这些是否会更好。(通常最简单的就是最好的)

于 2012-12-12T13:52:21.890 回答
1

轮询不是最佳解决方案。如果您有大量的客户或用户,那么数据库将一直忙于回答民意调查。

如果可能的话,用户阻止或等待更新是更可取的。用户通常更喜欢响应式系统。

在决定之前要考虑的两个主要标准是并发用户的最大数量以及需要多快通知用户他们表示感兴趣的事件。

于 2012-12-13T05:29:09.983 回答
1

如果您的数据库支持,比轮询更好的解决方案是 select() 或类似 inotify() 的方法。例如,PostgreSQL 支持 select(),因此您可以在等待输入到 DB 时执行非忙循环。话虽如此,Database-as-IPC被认为是一种反模式。

于 2014-06-23T16:01:35.037 回答
0

最简单的解决方案就是轮询另一个进程。

但是,如果您希望另一个进程立即收到数据更改,则应该考虑使用一些通知机制,例如 rpc、http 请求等。

于 2012-12-12T14:06:34.507 回答