- 浏览: 162023 次
- 性别:
- 来自: 西安
文章分类
最新评论
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();
}
}
需求:有个小程序,需要查询数据库,查询时间较长,现在想增加一个停止查询功能。
在网上看了下,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();
}
}
发表评论
-
回调hanshu
2018-10-15 23:09 0java callback -
根据类名查找jar包路径
2018-08-12 01:04 940ProtectionDomain pd = StringUt ... -
https
2018-04-20 23:14 01:导出证书用IE的证书工具可以将网站的证书导出。打开网 ... -
mock request
2017-08-20 02:56 0一:postprotected ApplicationCont ... -
使用mockMvc测试文件上传
2017-08-20 01:52 6390@Autowired BanksController bank ... -
java 线程池实现多并发队列后进先出
2017-02-15 00:33 1872java实现线程池多并发队列后进先出 目前默认的队列都是先 ... -
apache ftp server
2017-01-11 22:41 637apache ftp server -
证书制作工具
2016-06-29 23:28 712证书制作工具 -
spring mvc 初始化加载bean
2016-06-15 20:28 1379<context:component-scan bas ... -
Ribbon 和 Eureka 的集成
2016-06-11 00:42 2883Ribbon 是 Netflix 发布的云中间层服务开源项目 ... -
RestTemplate实践
2016-06-11 00:30 948什么是RestTemplate? RestTemplat ... -
@Component(“”)和@resource(name=””)的使用:
2016-06-08 01:24 12262@Component(“”)和@resource(nam ... -
springboot ant部署
2016-06-08 01:03 988springboot ant部署 -
springboot 使用外部tomcat启动
2016-06-05 22:59 1557package sample.xml; import o ... -
swagger 实现文件上传
2016-06-01 22:23 5689@ResponseBody @RequestMa ... -
swagger
2016-06-01 21:18 0import static springfox.docum ... -
java
2016-05-26 01:14 0swagger2.0 -
swagger
2016-05-26 00:32 0spring swagger -
java 域名解析
2016-05-18 23:18 485import java.net.InetAddress;im ... -
swing 模拟文件上传
2016-05-15 17:32 534swing 模拟文件上传
相关推荐
无论是简单的数据查询还是复杂的事务处理,Java都能通过标准的JDBC(Java Database Connectivity)接口实现对多种数据库的有效操作。本文将详细介绍如何在Java中实现与数据库的连接,并通过一个具体的示例来展示这一...
这是Java中处理异常的常见方式,确保程序在遇到错误时能够优雅地终止。 8. **数据库操作的最佳实践**: 实验可能强调了使用参数化查询的重要性,以避免SQL注入攻击。此外,使用连接池管理数据库连接,可以提高性能并...
Java数据库相关知识点: 1. 数据库有穷性:算法的有穷性是指算法必须在执行有限个步骤后终止,这是算法设计的基本原则之一。确保程序不会陷入无限循环或无法结束。 2. 线性数据结构:线性数据结构包括队列、线性表...
在Java编程环境中,读取纯真IP地址数据库是一项常见的任务,尤其对于需要进行IP定位或者网络管理的应用来说。纯真IP数据库(通常称为QQWRY或IPSeeker)是一个包含了全球IP地址及其对应地理位置信息的数据库,它由一...
在本例中,可能创建了多个线程来并行执行数据库查询,每个线程负责一个或多个任务,这样可以大大提高整体处理速度。 4. **同步与线程安全**:在多线程环境中,数据共享可能会引发竞态条件和死锁问题。因此,Java...
7. **异常处理**:为了确保系统的健壮性,Java的异常处理机制(try-catch-finally语句块)会被用来捕获和处理可能出现的错误,防止程序意外终止。 8. **单元测试**:为了确保代码质量,开发者可能会使用JUnit或其他...
在Java编程中,本示例代码展示了如何创建一个简单的Swing GUI应用程序,用于实现一个基于Java通讯录的登录系统,并连接到MySQL数据库。以下是对代码中涉及的关键知识点的详细解释: 1. **Java Swing GUI**: - `...
【数据库数据操作Java设计报告】 本报告主要探讨的是如何使用Java进行数据库操作,特别是通过Java JDBC(Java Database Connectivity)技术来实现对数据库的增、删、改、查功能。JDBC是Java中用于访问和操作关系...
此外,对于长时间运行的任务,可以考虑采用中断机制,使任务能够定期检查是否被中断,以便于在超时后能够及时清理资源并终止执行。 总之,Java提供了多种方法来监控和管理线程的超时,包括使用`Future`、`...
### Java实现从数据库读取数据放入JList中的关键技术点 #### 一、项目背景与目的 本案例旨在演示如何利用Java编程语言从数据库中提取数据,并将其展示在JList组件中。这一技术常用于需要从数据库获取信息并实时更新...
本教程主要涵盖五个核心领域:多线程、Swing图形界面、Applet小程序、网络程序设计以及JDBC数据库编程,旨在帮助初学者全面了解并掌握Java在实际应用中的各种技巧。 一、多线程 多线程是Java的重要特性,它允许程序...
Java的try-catch-finally语句块可以捕获并处理可能出现的异常,避免程序意外终止。 此外,为了实现信息的实时更新,系统可能采用多线程技术,如创建后台线程定期从服务器同步最新的公交信息。Java的Thread类或...
例如,可能会解析客户端的查询请求,查询数据库并返回结果。在处理完一次请求后,线程并不会立即终止,而是等待新的数据到来,以保持与客户端的连接。 `TcpClient.java`文件则代表了客户端程序,它会建立到服务器的...
以上只是Java基础部分的一部分,面试中还可能涉及数据库知识(如SQL查询、事务管理等),框架(如Spring Boot、MyBatis等)和微服务(如Docker、Spring Cloud等)的相关内容,需要根据具体职位和技术栈进行深入学习...
在Java中,这可以通过调用JFrame类的dispose()方法来关闭窗体,然后使用System.exit(0)来安全地终止程序。 在整个开发过程中,还需考虑异常处理,确保程序在遇到错误时能够优雅地处理,提供友好的错误提示。同时,...
3. 查询算法模块:实现线路查询算法,根据用户输入的起始和终止站点,找出最合适的公交线路。这可能涉及到图论中的最短路径算法,如Dijkstra算法或A*搜索算法。 4. 错误处理模块:确保程序在遇到异常情况时能正常...
Java连接DB2数据库通常涉及到几个关键知识点,包括Java数据库连接(JDBC)、DB2数据库驱动、jar包管理和使用。在本场景中,"最实用的java连接DB2 jar包" 提供了必要的库文件,使得Java应用程序能够与IBM的DB2数据库...
- **本地库 Java 实现驱动** (`Native Library Implementation Driver`): 通过本地库与数据库通信。 - **网络协议驱动** (`Network Protocol Driver`): 通过网络协议与数据库服务器通信。 - **数据库协议驱动** ...
在Java中,如Apache Commons DBCP或HikariCP等库提供了数据库连接池的实现。连接池预先初始化一定数量的数据库连接,当应用需要时可以从池中获取,用完后归还,避免了频繁的创建和销毁连接带来的开销。对于网络编程...
这个项目不仅涵盖了基础的Java编程和SQL查询,还涉及到数据库连接、数据处理以及可能的数据可视化。 首先,我们需要了解Java中的JDBC(Java Database Connectivity),这是Java连接到各种数据库的标准接口。通过...