Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java update语句中的线程卡住:取消或关闭语句,并中断线程不工作_Java_Multithreading - Fatal编程技术网

Java update语句中的线程卡住:取消或关闭语句,并中断线程不工作

Java update语句中的线程卡住:取消或关闭语句,并中断线程不工作,java,multithreading,Java,Multithreading,我已经读了很多关于停止线程的书,但是我还没有找到解决问题的方法: 我有一个Sybase DB连接,连接了3个线程。 加上一个线程来监视这3个线程 但是,由于服务器超载(我知道:我应该解决这个问题,但我们还没有钱),调用: 语句stmt.executeUpdate(“从某个表中更新某个内容”); 永远不会回来 以下是线程的大致功能(不可编译,因为它无论如何都不可复制): 这应该是一个粗略的想法。 另一方面,我有一个“MonitorThemAll”线程来检查lastQueryRunTime:如果太长

我已经读了很多关于停止线程的书,但是我还没有找到解决问题的方法:

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

但是,由于服务器超载(我知道:我应该解决这个问题,但我们还没有钱),调用: 语句stmt.executeUpdate(“从某个表中更新某个内容”); 永远不会回来

以下是线程的大致功能(不可编译,因为它无论如何都不可复制):

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

因此,在监控线程中,我尝试了: 正在更改KeeponGong标志。。。但是,由于线程被困在更新查询中,所以它没有做多少工作 然后: stmt.cancel(),stmt.close()=>它似乎没有什么作用。执行kill-3显示线程仍然卡在executeUpdate行上

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

我在这里和谷歌上找到的解决方案快用完了。。。 由于thread.close()已被弃用(尽管我希望避免使用,以便能够恢复占用的资源),我不知道还能尝试什么


有人想试试吗?

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

是否要在更新后执行conn.commit()?我认为您遇到了典型的数据库死锁问题。如果线程继续运行(即多个更新仍在运行),或者它只是停留在executeUpdate中,您是否尝试打印?您能否澄清您正在尝试执行的操作?如果数据库需要很长时间才能响应。。你想。。。什么?executeUpdate实际上从未返回。。。“正常”超时由“stmt.setQueryTimeout(4);”(在4秒后超时,在这种情况下,我捕获异常,并在bucket中重新添加查询)正确处理:它是Sybase/Netcool DB,因此不需要提交。实际上,查询永远不会返回。。。它只是永远停留在那里。“正常超时”已经由“stmt.setQueryTimeout(4);“它抛出了一个异常,我也处理了这个异常,我最终想要实现的是:线程永远卡在executeUpdate中”=>我需要一种方法退出这个executeUpdate并继续(这是最优雅的方式,但通常的取消/关闭不起作用)。。。或者以某种方式使线程停止,或者杀死线程或任何需要的东西(从优雅的退出到残忍的杀死)您不能在Java中终止线程。只尝试中断它,如果行为正常,它将停止。因此,您需要调查查询从未返回的原因并解决该问题。首先想到的是表被锁定,这就是查询未返回的原因。请尝试验证这一点。我尝试过中断它,但没有任何效果(该语句可能没有实现InterruptbleChannel)是的:我知道问题来自数据库:它只在服务器严重过载时才会出现。此外,当表被锁定时,“stmt.setQueryTimeout(4);”触发器,我已经正确地处理了。问题来自这样一个事实:一个线程由于某种原因被锁定,我需要找到一种方法来解锁它,在Java方面,你是说使用
stmt.setQueryTimeout
虽然表被锁定,但你得到了异常,线程继续运行?如果是这种情况,那么你为什么说难道查询永远不会返回吗?
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;
    }
}