【发布时间】:2012-02-23 11:06:09
【问题描述】:
我有一个网络服务器,它处理来自多个来源/机器的事件。 对于每个事件,我都会给出一个时间戳,并将其存储在数据库中。这样,即使不是源机器中的所有时钟都有准确的时间——也没关系。事件的顺序将被保留,因为服务器对时间戳负责。
现在,我想再添加一台可以处理这些事件的服务器,并将它们存储在同一个数据库中。 在服务器之间同步时钟的最佳方法是什么?服务器部署在客户站点上,虽然我可以告诉他时钟必须同步,但我想确保这一点。
有没有办法在服务器之间不通信的情况下解决它? 有没有办法在 SQL 语句中使用数据库机器时钟? (我应该支持mysql、sqlserver和oracle。我的O/R映射是休眠的)。
【问题讨论】:
-
听起来您需要使用 NTP 来同步服务器时钟,或者使用 SQL 函数在插入数据时插入时间戳。但不确定是否可以跨多种数据库类型使用 Hibernate
-
同步时钟并不能确保事件的顺序得以保留,因为如果一个事件发生在两个地方,将不再成为明确定义的事件顺序。如果必须对事件进行排序,则需要对它们进行排序。什么以及如何取决于必须对 why 事件进行排序。 -- 你的实际需求是什么?
-
@DavidSchwartz 对于每台机器,我都会收到进度事件,例如:初始化、运行、完成。如果我在完成后开始跑步,我会将进度条显示为“正在运行”,尽管它已经完成了。这里的问题是有时会发生(如果某个进程在循环中运行)。所以,我不能在这里做任何逻辑,我需要知道事件的确切顺序是什么,跨服务器。
-
@Jonathan 听起来您需要在事件的源头用序列标记事件。即使您在服务器上准确地标记它们,“已完成”事件仍可能在“运行”事件之后到达服务器 - 假设一个事件进入未加载的服务器,一个事件进入已加载的服务器,导致它们被处理掉秩序。有很多解决方案,例如在事件源中添加时间戳,但选择正确的解决方案需要更详细地了解事件的来源、提交方式等。
标签: java sql database jakarta-ee