java 终止数据库查询

本文介绍了如何在Java程序中结束长时间的数据库查询。由于`Thread.stop()`已不推荐使用,作者建议使用`Thread.interrupt()`配合`Statement.cancel()`来中断查询。创建一个`ThreadInterruptMonitor`类,它定时检查并取消未完成的查询,当接收到中断信号时,通过`stmt.cancel()`来终止数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java 结束掉一个查询数据库进程作者:达内 更新时间:2012-10-15 9:42:56 来源:成都达内 【字号: 大 中 小】 浏览79次
需求:有个小程序,需要查询数据库,查询时间较长,现在想增加一个停止查询功能。

在网上看了下,Thread.stop()方法已经不建议使用了(http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html)。对于周期执行的进程如果想停掉,一般用这种方法:


[java] view plaincopyprint?public class StoppableTask extends Thread {
private volatile boolean pleaseStop;

public void run() {
while (!pleaseStop) {
// do some stuff...
}
}

public void tellMeToStop() {
pleaseStop = true;
}
}

public class StoppableTask extends Thread {
private volatile boolean pleaseStop;

public void run() {
while (!pleaseStop) {
// do some stuff...
}
}

public void tellMeToStop() {
pleaseStop = true;
}
}对于长时间执行的进程,如果是sleep等等(Thread文档interrupt部分)可以interrupt抛异常的,就用interrupt。

对于查询数据库,就写了一个类,每次查询的时候都起这么一个定期扫描进程,当想结束掉查询的时候,就thread.interrup(),然后这个定期扫描进程如果发现还在查询数据库没有查询完成,会调用statement.cancel(),然后那个正在查询的进程会抛一个interrupt类似的异常(理论可以,下面还没来得及测试)。


[java] view plaincopyprint?package util;

import java.sql.Statement;
import org.apache.log4j.Logger;

public class ThreadInterruptMonitor extends Thread {
private static transient Logger logger = Logger.getLogger(ThreadInterruptMonitor.class);
private Thread thread;
private Statement stmt;
private Integer checkInterval = 1000;

public ThreadInterruptMonitor(Thread thread, Statement stmt) {
this.thread = thread;
this.stmt = stmt;
}

public ThreadInterruptMonitor(Thread thread, Statement stmt, Integer checkInterval) {
this.thread = thread;
this.stmt = stmt;
this.checkInterval = checkInterval;
}

@Override
public void run() {
try {
while (true) {
if (stmt.isClosed()) {
return;
}
if (thread.isInterrupted()) {
stmt.cancel();
return;
}
Thread.sleep(checkInterval);
}
} catch (Exception e) {
logger.error("ThreadInterruptMonitor", e);
}
}
}


举个简单的例子

public class Tasks {
OracleStatement state;

...

public Type querySql() {
...
}

public boolean cancelSql() {
// 需要加一些同步逻辑
if ( state != null )
state.cancel();
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值