如果我有两个进程在不同的节点上运行并且它们共享一个数据库,那么是否存在一个节点能够通过数据库向另一个进程发送一些通知的模式?
是某种轮询通常使用的表还是有更好的方法?
答案 0 :(得分:3)
而不是轮询(转换为不仅燃烧CPU周期,而且在这种情况下也转换为数据库资源和带宽),这个怎么样?如果您使用的是Oracle,则可以为要通知的表定义触发器ON UPDATE,并从触发器调用Java存储过程(JSP)。然后,JSP可以使用任何通知机制来通知其他组件有关更改的信息。这不会非常快,但很好......
正确的方法是让组件更新数据库向其他组件发送并行通知,并再次使用任何可用的技术用于此RMI,JMS等
答案 1 :(得分:2)
如果要使用数据库,可以将条目插入到生产方的表中,并轮询以在消费方查找新条目。这可能是您项目最简单的选择。
有许多可能的替代方案,如JMI,RMI,套接字,NoSql数据库,文件,但没有更多信息,无法判断这些是否更好。 (通常最简单的是最好的)
答案 2 :(得分:1)
轮询不是最佳解决方案。如果您拥有大量客户或用户,数据库将继续忙于回答民意调查员。
如果可能,阻止或等待更新的用户更可取。用户通常更喜欢响应系统。
在决定之前要考虑的两个主要标准是并发用户的最大数量以及用户需要多快通知他们表示有兴趣的事件。
答案 3 :(得分:0)
最简单的解决方案是轮询另一个进程。
但是,如果您希望另一个进程立即收到数据更改,那么您应该考虑使用一些通知机制,例如rpc,http请求等。
答案 4 :(得分:0)
如果您的数据库支持,则比轮询更好的解决方案是select()或类似inotify()。例如,PostgreSQL支持select(),因此您可以在等待输入数据库时执行非忙循环。话虽如此,Database-as-IPC被认为是一种反模式。