Java 语句.cancel()及其线程安全保证

Java 语句.cancel()及其线程安全保证,java,jdbc,thread-safety,prepared-statement,specifications,Java,Jdbc,Thread Safety,Prepared Statement,Specifications,不幸的是,jdbc规范对语句.cancel()的保证保持沉默 唯一由声明的是语句。cancel()是。 但是: 是否保证cancel()将始终工作?(当前执行语句的线程将立即解除阻止并继续) 是否保证cancel()不会被阻止并(或多或少)立即返回 来自同一个javadoc: 如果DBMS和驱动程序都支持中止SQL语句 这限制了担保。另一个限制是语句.cancel()是由具体的驱动程序实现的,换句话说,该实现不是Java RE的一部分 因此,取消应该是线程安全的,但是您必须询问实际驱动程序/D

不幸的是,jdbc规范对
语句.cancel()
的保证保持沉默

唯一由声明的是
语句。cancel()
是。
但是:

  • 是否保证
    cancel()
    将始终工作?
    (当前执行
    语句的线程将立即解除阻止并继续)
  • 是否保证
    cancel()
    不会被阻止并(或多或少)立即返回
来自同一个javadoc:

如果DBMS和驱动程序都支持中止SQL语句

这限制了担保。另一个限制是
语句.cancel()
是由具体的驱动程序实现的,换句话说,该实现不是Java RE的一部分

因此,取消应该是线程安全的,但是您必须询问实际驱动程序/DBMS的供应商

是否保证cancel()始终有效

不,至少以我的经验是这样。我想我甚至不得不面对那些只会抛出一个不支持的操作异常的司机

是否可以保证cancel()不会被阻塞,并且(或多或少)会立即返回


否。根据正在执行的语句,有时cancel()可能会等到返回查询的第一行。这同样高度依赖于驱动程序。

至少对于oracle jdbc驱动程序,没有这样的保证-尤其是在网络或服务器端问题的情况下:是否可以为取消进程设置超时以严格终止进程?我考虑了一个
语句。cancel(int timeout)
方法,但没有找到;)