【发布时间】:2011-06-25 23:17:07
【问题描述】:
我有一个场景,我的 Java 程序必须不断地与数据库表通信,例如,当我的 Java 程序在运行时向它添加新行时,它必须获取我的表的数据。我的程序和数据库之间应该有持续的通信。
如果表最初有 10 行,并且用户添加了 2 行,它必须检测到这一点并返回这些行。
我的程序不应该使用 AJAX 和计时器。
【问题讨论】:
-
是通过 Java 程序还是通过其他应用程序对数据库进行调用(添加行)?
我有一个场景,我的 Java 程序必须不断地与数据库表通信,例如,当我的 Java 程序在运行时向它添加新行时,它必须获取我的表的数据。我的程序和数据库之间应该有持续的通信。
如果表最初有 10 行,并且用户添加了 2 行,它必须检测到这一点并返回这些行。
我的程序不应该使用 AJAX 和计时器。
【问题讨论】:
如果您使用的数据库是 Oracle,请考虑使用 triggers,调用 java stored procedure,通知您的客户端数据库中的更改(使用 JMS、RMI 或任何您想要的)。
【讨论】:
没有 Ajax 和计时器,它似乎无法完成这项任务。
我也遇到过同样的问题,当数据发生变化时,我需要将一些数据从服务器推送到客户端。
为此,您可以使用服务器推送 AKA “彗星” 编程。
在评论中
还要监控数据库的变化,你可以有两件事,
Quartz Scheduler)基本上,客户端无法知道服务器端发生的任何事情,因此您必须推送一些数据或事件来告诉客户端i have some new data, please call some method。它的那种通知。所以请用事件通知检查彗星/服务器推送。
希望这会有所帮助。
谢谢。
【讨论】:
真的不是最简单的问题。
让我们把它分成2个更小的问题:
1) 如何在没有计时器和 ajax 的情况下启用重新加载
2)服务器端如何实现
无法从服务器通知客户端。因此,您需要使用 flash 或 silverlight 或 JavaFX 或 Applets 来创建胖客户端。如果 Ajax 的问题是您不知道如何使用它来解决这个问题,那么您可以研究一些现成的 jsp 标记库或支持 ajax 的 jsf 组件。
如果您只有一台服务器,那么只需添加一个缓存。如果有多个服务器,则考虑使用分布式缓存。
【讨论】:
如果您有一个低流量的数据库,您可以实现一个线程来快速检查数据库的更新(轮询)。
如果您有一个高流量的数据库,我不建议这样做,因为轮询会产生大量额外的流量。
【讨论】:
服务器通知客户端不是一个好主意(考虑一个有 1000 个客户端的场景)。你是使用一些持久层还是必须坚持纯 JDBC?
【讨论】:
如果你在 MYSQL 中开启了二进制日志,你可以看到数据库中发生的所有事务。
【讨论】:
一种可移植的方法是添加一个列时间戳(创建日期),以指示该行何时添加到表中。在初始加载内容后,您只需轮询 where 子句 current_time >= create_date 的新内容。如果行可能具有相同的时间戳,您需要在添加它们之前过滤重复项。
【讨论】: