gpt4 book ai didi

Java - 停止访问数据库的长时间运行的线程

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:59 25 4
gpt4 key购买 nike

我启动了几个线程,但我没有它们的引用可以通过信号或其他方式停止。例如,我无法将像 running=false 这样的变量传递给那些线程,因为我没有它们的引用,但有它们的名称。

我正在使用一个 ThreadGroup 并且我总是有它的引用。所以我可以做这样的事情。好像不行。

    Thread[] threads = new Thread[threadGroup.activeCount()];
int count = threadGroup.enumerate(threads);
for(int i = 0; i < count; i++){
threads[i].interrupt();
}

这是我的线程示例。

    public void run{

try{
//myDAO.getRecords();
//this takes 30seconds to 60
//returns about 3 millions of records

}catch(Exception e){
//log
}
}

当这个线程正在执行的时候,我想中途停止。不管怎样,batabase 查询正在运行,但我想停止获取结果。

即使调用 interrupt(),我仍然会得到结果。还有其他方法可以做到这一点或者我做错了什么吗?最终任务是从 Java 中取消长时间运行的 sql 查询。

最佳答案

为等待查询输出的线程调用 interrupt 没有影响,因为大多数 JDBC 驱动程序都不受状态影响。它仍将保持阻塞状态,查询将继续执行。

调用cancel 将终止连接和在数据库中执行查询的线程。偶尔它没问题,但它也会终止连接。这会造成严重的问题,很快就会成为瓶颈。

另一种可行的解决方案是获取执行过程/查询(在数据库端)的线程的 ID 并调用:

KILL QUERY id;

KILL QUERY terminates the statement that the connection is currently executing, but leaves the connection itself intact.

要知道 ID,就在程序中,第一行为:SELECT CONNECTION_ID();。此 Id 可用于终止它。

关于Java - 停止访问数据库的长时间运行的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com