Statement.cancel()及其线程安全保证(s)

3

不幸的是,JDBC规范对于Statement.cancel()的保证没有明确说明。

javadoc唯一提到的是Statement.cancel()线程安全的。
但是:

  • 是否保证cancel()总是有效?(当前执行Statement的线程将立即解除阻塞并继续执行)
  • 是否保证cancel()不会阻塞,并且(或多或少)立即返回?

至少对于Oracle JDBC驱动程序,没有这样的保证 - 特别是在网络或服务器端问题的情况下:http://download.oracle.com/docs/cd/E11882_01/java.112/e16548/apxtblsh.htm#BACDAICJ - MRalwasser
2个回答

3

cancel() 方法是否保证总是起作用?

不一定。至少在我的经验中并非如此。我认为我甚至需要处理那些只会抛出 UnsupportedOperationException 异常的驱动程序。

cancel() 方法是否保证不会阻塞并(或多或少)立即返回?

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


有没有可能为取消进程设置超时时间以彻底终止进程?我考虑过使用 Statement.cancel(int timeout) 方法,但是我没有找到这个方法 ;) - bobbel

2

从同一个javadoc中:

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

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

因此,取消操作确实应该是线程安全的,但您需要询问实际驱动程序/ DBMS的供应商。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接