加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:44:27 所属栏目:Java 来源:网络整理
导读:我开始了几个线程,但是我没有参考信号停止信号或某事. 例如,我不能像run = false这样的变量传递给这些线程,因为我没有他们的引用,而是有他们的名字. 我正在使用一个ThreadGroup,总是有它的参考.所以我可以做这样的事情.似乎是不行的. Thread[] threads = new
我开始了几个线程,但是我没有参考信号停止信号或某事.
例如,我不能像run = 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
         }
    }

当这个线程正在执行时,我想在中间停止它.
无论如何,数据库查询正在运行,但我想停止获取结果.

仍然我得到结果,即使我打电话给中断().
有什么其他方法可以做到吗?最终,任务是从Java中取消长时间运行的sql查询.

解决方法

对于等待查询输出的线程调用中断没有任何影响,因为大多数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可用于终止它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读