`

java 终止数据库查询

    博客分类:
  • java
阅读更多
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();
    }   

}

分享到:
评论

相关推荐

    java与数据库的连接

    无论是简单的数据查询还是复杂的事务处理,Java都能通过标准的JDBC(Java Database Connectivity)接口实现对多种数据库的有效操作。本文将详细介绍如何在Java中实现与数据库的连接,并通过一个具体的示例来展示这一...

    Java实验8 数据库.doc

    这是Java中处理异常的常见方式,确保程序在遇到错误时能够优雅地终止。 8. **数据库操作的最佳实践**: 实验可能强调了使用参数化查询的重要性,以避免SQL注入攻击。此外,使用连接池管理数据库连接,可以提高性能并...

    java 数据库

    Java数据库相关知识点: 1. 数据库有穷性:算法的有穷性是指算法必须在执行有限个步骤后终止,这是算法设计的基本原则之一。确保程序不会陷入无限循环或无法结束。 2. 线性数据结构:线性数据结构包括队列、线性表...

    java读取纯真IP地址数据库

    在Java编程环境中,读取纯真IP地址数据库是一项常见的任务,尤其对于需要进行IP定位或者网络管理的应用来说。纯真IP数据库(通常称为QQWRY或IPSeeker)是一个包含了全球IP地址及其对应地理位置信息的数据库,它由一...

    Java操作Oracle数据库-多线程.rar

    在本例中,可能创建了多个线程来并行执行数据库查询,每个线程负责一个或多个任务,这样可以大大提高整体处理速度。 4. **同步与线程安全**:在多线程环境中,数据共享可能会引发竞态条件和死锁问题。因此,Java...

    java员工管理系统源码,附数据库文件。

    7. **异常处理**:为了确保系统的健壮性,Java的异常处理机制(try-catch-finally语句块)会被用来捕获和处理可能出现的错误,防止程序意外终止。 8. **单元测试**:为了确保代码质量,开发者可能会使用JUnit或其他...

    java通讯录连接mysql数据库

    在Java编程中,本示例代码展示了如何创建一个简单的Swing GUI应用程序,用于实现一个基于Java通讯录的登录系统,并连接到MySQL数据库。以下是对代码中涉及的关键知识点的详细解释: 1. **Java Swing GUI**: - `...

    数据库数据操作Java设计报告

    【数据库数据操作Java设计报告】 本报告主要探讨的是如何使用Java进行数据库操作,特别是通过Java JDBC(Java Database Connectivity)技术来实现对数据库的增、删、改、查功能。JDBC是Java中用于访问和操作关系...

    Java线程超时监控

    此外,对于长时间运行的任务,可以考虑采用中断机制,使任务能够定期检查是否被中断,以便于在超时后能够及时清理资源并终止执行。 总之,Java提供了多种方法来监控和管理线程的超时,包括使用`Future`、`...

    Java实现从数据库读取数据放入JList中.doc

    ### Java实现从数据库读取数据放入JList中的关键技术点 #### 一、项目背景与目的 本案例旨在演示如何利用Java编程语言从数据库中提取数据,并将其展示在JList组件中。这一技术常用于需要从数据库获取信息并实时更新...

    轻松学习Java(多线程、swing、applet、网络程序设计、数据库)

    本教程主要涵盖五个核心领域:多线程、Swing图形界面、Applet小程序、网络程序设计以及JDBC数据库编程,旨在帮助初学者全面了解并掌握Java在实际应用中的各种技巧。 一、多线程 多线程是Java的重要特性,它允许程序...

    基于java的公交信息管理系统

    Java的try-catch-finally语句块可以捕获并处理可能出现的异常,避免程序意外终止。 此外,为了实现信息的实时更新,系统可能采用多线程技术,如创建后台线程定期从服务器同步最新的公交信息。Java的Thread类或...

    java多线程tcp查询

    例如,可能会解析客户端的查询请求,查询数据库并返回结果。在处理完一次请求后,线程并不会立即终止,而是等待新的数据到来,以保持与客户端的连接。 `TcpClient.java`文件则代表了客户端程序,它会建立到服务器的...

    java基础,数据库,框架,微服务面试相关复习知识汇总

    以上只是Java基础部分的一部分,面试中还可能涉及数据库知识(如SQL查询、事务管理等),框架(如Spring Boot、MyBatis等)和微服务(如Docker、Spring Cloud等)的相关内容,需要根据具体职位和技术栈进行深入学习...

    java 小项目系统

    在Java中,这可以通过调用JFrame类的dispose()方法来关闭窗体,然后使用System.exit(0)来安全地终止程序。 在整个开发过程中,还需考虑异常处理,确保程序在遇到错误时能够优雅地处理,提供友好的错误提示。同时,...

    J2SE.rar_j2se_java公交查询_基于java的公交

    3. 查询算法模块:实现线路查询算法,根据用户输入的起始和终止站点,找出最合适的公交线路。这可能涉及到图论中的最短路径算法,如Dijkstra算法或A*搜索算法。 4. 错误处理模块:确保程序在遇到异常情况时能正常...

    最实用的java连接DB2 jar包

    Java连接DB2数据库通常涉及到几个关键知识点,包括Java数据库连接(JDBC)、DB2数据库驱动、jar包管理和使用。在本场景中,"最实用的java连接DB2 jar包" 提供了必要的库文件,使得Java应用程序能够与IBM的DB2数据库...

    java父子资料(答案)

    - **本地库 Java 实现驱动** (`Native Library Implementation Driver`): 通过本地库与数据库通信。 - **网络协议驱动** (`Network Protocol Driver`): 通过网络协议与数据库服务器通信。 - **数据库协议驱动** ...

    Java网络编程-多线程,连接池

    在Java中,如Apache Commons DBCP或HikariCP等库提供了数据库连接池的实现。连接池预先初始化一定数量的数据库连接,当应用需要时可以从池中获取,用完后归还,避免了频繁的创建和销毁连接带来的开销。对于网络编程...

    java + SQL 课程设计

    这个项目不仅涵盖了基础的Java编程和SQL查询,还涉及到数据库连接、数据处理以及可能的数据可视化。 首先,我们需要了解Java中的JDBC(Java Database Connectivity),这是Java连接到各种数据库的标准接口。通过...

Global site tag (gtag.js) - Google Analytics