【发布时间】:2023-04-03 12:36:01
【问题描述】:
我已经阅读了很多关于停止线程的信息,但我无法找到解决问题的方法:
我有一个连接了 3 个线程的 Sybase DB 连接。 加上一个线程来监控这 3 个线程。
但是,由于服务器超载(我知道:我应该解决这个问题,但我们还没有钱),调用: Statement stmt.executeUpdate("从 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() 已被弃用(尽管如此,我想避免,以便我可以恢复使用的资源),我不知道我还能尝试什么......
有人知道要尝试的事情吗?
【问题讨论】:
-
更新后不想执行conn.commit()吗?我认为您有经典的数据库死锁问题。
-
如果线程继续运行(即多个更新仍在进行),或者它只是卡在 executeUpdate 中,您是否尝试过打印?
-
你能澄清你想要做什么吗?如果数据库需要很长时间才能响应......你想......什么?
-
executeUpdate 实际上永远不会返回...“正常”超时由“stmt.setQueryTimeout(4);”正确处理(在 4 秒后超时,在这种情况下我会捕获异常,并在存储桶中重新添加查询)
-
关于提交:它是一个 Sybase/Netcool DB,所以不需要提交。
标签: java multithreading