0

我一直在阅读很多关于停止线程的信息,但我无法找到解决我的问题的方法:

我有一个连接了 3 个线程的 Sybase DB 连接。加上一个线程来监视这 3 个线程。

然而,因为服务器超载(我知道:我应该解决这个问题,但我们还没有钱),调用:Statement stmt.executeUpdate("update something from some_table"); 永远不会回来。

这是线程大致执行的操作(不可编译,因为它无论如何都不可重现):

class runQuery implements Runnable {
    public Connection conn;
    public long lastQueryRunTime = 0;
    public Statement stmt;
    public volatile keepongoing = true;

    runQuery(Connection conn, String Probe, String Server, int thisthread) {
         this.conn = conn;
         Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
         conn = DriverManager.getConnection("jdbc:sybase:Tds:"+Server+":4100?SERVICENAME="+Probe,"login","password");
    }

    public void run () {
        while(keepongoing) {
        query = "update something from some_table";
        lastQueryRunTime = System.currentTimeMillis()/1000;
        stmt = conn.createStatement();
        stmt.setQueryTimeout(4);
        int result = stmt.executeUpdate(query);
        lastQueryRunTime = 0;
    }
}

这应该给出一个粗略的想法。另一方面,我有一个“MonitorThemAll”线程来检查 lastQueryRunTime:如果它太长,我想......做点什么!

因此,从监控线程中,我尝试过:更改 keepongoing 标志 ...但由于线程卡在更新查询中,它并没有做太多然后:stmt.cancel(), stmt.close() =>它似乎没有多大作用。执行 kill -3 表明线程仍然停留在 executeUpdate 行上。

我转向更有力的解决方案: conn.close() => 从那里开始,每次尝试 stmt.cancel/close 时都会出现异常“JZ0C0:连接已关闭”(这些异常是由 stmt.cancel/close 命令引发的: 即:它们在 MonitorThemAll 线程中,而不是在 runQuery 线程中......)而且:mythread.interrupt() => 之后仍然停留在更新查询中!

我在这里和谷歌上找到的解决方案已经用完了......因为 thread.close() 已被弃用(即使,我想避免,以便我可以恢复所使用的资源),我不知道我还能尝试什么...

会有人知道要尝试的事情吗?

4

1 回答 1

1

假设您的问题是 sql 查询太长而无法执行,您可以将 sql 查询传递给后台线程以执行查询并在查询完成时获取结果(通过回调侦听器或队列)。

于 2013-02-15T14:23:58.357 回答