0

每 5 秒后,一个节点 ping 服务器。如果 ping 成功,节点的时间戳会更新到服务器数据库中。每 3 分钟服务器检查是否有任何超过 3 分钟的时间戳。如果找到,它会从其数据库中删除该节点。

现在的问题。我无法实现此查询。例如,我希望它以一种相当简单的方式,例如:

// Get the server time-stamp in milliseconds

select LastPingedAt from JustPinged where LastPingedAt > 3 Minutes"

// If it finds any,delete each of them from the database.

The logic :
Let the server's time stamp at the point of checking be 'serverStamp'
Let the node's time stamp (time in milliseconds when it last pinged) in the 
database's table be 'nodeStamp'.

If ( serverStamp - nodeStamp > 3 minutes)
// Delete those nodes
If( severStamp - nodeStamp < 3 minutes)
// retain those nodes

我无法设计查询以进一步实施。

在任何时候,JustPinged表格看起来像:

--------------------------|----------------------
NodesThatJustPinged       |          LastPingedAt
--------------------------|-----------------------
 xxx.xxx.xxx.xxx          |          1355406367402
--------------------------|-----------------------
 yyy.yyy.yyy.yyy          |          1355406421277
--------------------------|-----------------------

时间以毫秒为单位,从 开始new GregorianCalendar().getTimeInMillis()

4

2 回答 2

3

无需获取所有记录并在您的程序中处理它们。这可以通过一条 SQL 语句来完成。您只需要执行如下语句:

delete from JustPinged where CurrentTime - LastPingedAt > 180000;

所以你只需要在 Java 中构建字符串,插入当前时间值,然后运行它:

String query = "delete from JustPinged where " +
     [your current time variable here] + " - LastPingedAt > 180000;";

your_statement_object.executeQuery(query);
于 2012-12-13T14:04:03.987 回答
1

服务器知道它是当前时间戳(“现在”)。所以查询应该选择“LastPingedAt”值小于的所有行(现在 - 3*60*1000)。

就像是

diff := now-180000
select LastPingedAt from JustPinged where LastPingedAt < diff

(伪代码)

于 2012-12-13T14:04:38.200 回答