Java-停止运行数据库的长时间运行的线程
问题内容:
我启动了几个线程,但是我没有它们的引用因发出信号或其他东西而停止。例如,我无法将变量传递running=false
给这些线程,因为我没有它们的引用,但有它们的名称。
我正在使用a,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终止当前正在执行连接的语句,但保持连接本身不变。
要知道ID,请在该过程中,将第一行显示为:SELECT CONNECTION_ID();
。此ID可用于终止它。