我有一个线程池运行任务,主要使用JDBC查询Postgresql。如果取消已提交任务的未来将取消正在进行的任何查询,将会很方便。是否有捷径可寻?它只适用于Postgresql。
答案 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;
}
...