如何使用Postgresql中断运行JDBC查询的线程?

时间:2017-07-19 08:19:06

标签: java multithreading postgresql jdbc

我有一个线程池运行任务,主要使用JDBC查询Postgresql。如果取消已提交任务的未来将取消正在进行的任何查询,将会很方便。是否有捷径可寻?它只适用于Postgresql。

2 个答案:

答案 0 :(得分:1)

您可以使用Statement.cancel()

  

如果DBMS和驱动程序都支持中止SQL语句,则取消此Statement对象。一个线程可以使用此方法来取消正由另一个线程执行的语句。

eval $(docker-machine env --shell=bash) 在PostgreSQL JDBC驱动程序中实现(s。PgStatement

答案 1 :(得分:1)

事实证明,Postgres JDBC连接有一个非标准的cancelQuery()方法,可以取消连接上运行的任何查询。因此,在将任务及其连接一起提交并覆盖cancel()以调用cancelQuery()时,我将回到未来。

import org.postgresql.core.BaseConnection;

private static class ConFuture<T> implements Future<T> {

    private Future<T> wrapped;
    private volatile Connection con;

    public boolean cancel(boolean mayInterruptIfRunning) {
        boolean ans = wrapped.cancel(mayInterruptIfRunning);
        Connection con = this.con;
        if (con != null) {
            try {
                con.unwrap(BaseConnection.class).cancelQuery();
            } catch (SQLException e) {
                log.error("Unable to cancel query: " + e);
            }
        }
        return ans;
    }
    ...