Java 如何在一段时间后调用方法

Java 如何在一段时间后调用方法,java,mysql,Java,Mysql,我在本地主机上运行了一个MySQL数据库。到这个数据库我有JDBC连接。通过RESTful Web服务,softwareagent将结果放入该数据库。我用Java实现了一个垃圾收集器,并希望在一段时间后执行该垃圾收集器。我的目标是表中没有太多条目 垃圾收集器如下所示: public void collectGarbageResults() { ArrayList<Integer> ids = new ArrayList<Integer>(); Result

我在本地主机上运行了一个MySQL数据库。到这个数据库我有JDBC连接。通过RESTful Web服务,softwareagent将结果放入该数据库。我用Java实现了一个垃圾收集器,并希望在一段时间后执行该垃圾收集器。我的目标是表中没有太多条目

垃圾收集器如下所示:

public void collectGarbageResults() {
    ArrayList<Integer> ids = new ArrayList<Integer>();
    ResultSet rs = this.execQuery("SELECT * FROM results");
    try {
        while (rs.next()) {
            if ( (System.currentTimeMillis()) - (Timestamp.valueOf(rs.getString("tmstmp")).getTime()) > Long.parseLong(appconfigs.get("resultstableactuality")) ) {
                ids.add(rs.getInt("id"));
            }
        }

        for (Integer i : ids) {
            this.deleteResultsWhereId(i);
        }           
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
private void deleteResultsWhereId(int id) {
    retint = this.updateQuery("DELETE FROM results WHERE id=" + id + ";");
}
public class ExecuteGarbageCollector implements Runnable{

    @Override
    public void run() {
        DAO dao = new DAO();
        dao.collectGarbageResults();
    }

}
我在Eclipse的动态Web项目中使用JSF,这些方法在托管bean中实现。我将把间隔存储在一个XML文件中,用于应用程序的配置。通过变量appconfigs,我调用方法“get”,并请求包含我的间隔的节点

现在我的问题是:

在我的WebApp中,经过一段时间后,如何调用垃圾收集器的方法

如果您有任何问题,请随时发表评论

我的解决方案:

I调用的类实现Runnable,如下所示:

public void collectGarbageResults() {
    ArrayList<Integer> ids = new ArrayList<Integer>();
    ResultSet rs = this.execQuery("SELECT * FROM results");
    try {
        while (rs.next()) {
            if ( (System.currentTimeMillis()) - (Timestamp.valueOf(rs.getString("tmstmp")).getTime()) > Long.parseLong(appconfigs.get("resultstableactuality")) ) {
                ids.add(rs.getInt("id"));
            }
        }

        for (Integer i : ids) {
            this.deleteResultsWhereId(i);
        }           
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
private void deleteResultsWhereId(int id) {
    retint = this.updateQuery("DELETE FROM results WHERE id=" + id + ";");
}
public class ExecuteGarbageCollector implements Runnable{

    @Override
    public void run() {
        DAO dao = new DAO();
        dao.collectGarbageResults();
    }

}
查看调度程序库。例如,您可以使用。 . 你可以通过工作或触发器来启动它 只需坚持使用SQL,而忽略在Java中运行SQL。如果您擅长SQL,可能是最简单的。然后可以将其封装在存储过程或触发器中。 这是你的选择是否应该在你的网络应用程序或数据库中。我使用了这两种方法来执行定时SQL调用,并且倾向于使用面向代码的方法

Quartz有很多设备,但由于您只需要这个预定任务,所以它很简单

 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  scheduler.scheduleAtFixedRate(...);

看看关于这两个方面的一些评论:

实际的问题很可能是如何在特定的时间间隔后调用函数? 看看: 和

不幸的是,我不太擅长SQL。但我将使用Quartz或ScheduledExecutor服务。谢谢你的努力。我接受了你的答案,因为这两种选择都有效。我还不知道如何将它们包括到我现有的应用程序中,但我相信这将很快,因为你的最后一个链接。非常感谢。