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

前端之家收集整理的这篇文章主要介绍了Java – 停止访问数据库的长时间运行的线程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我开始了几个线程,但是我没有参考信号停止信号或某事.
例如,我不能像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可用于终止它.

猜你在找的Java相关文章