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

Posted

技术标签:

【中文标题】Statement.cancel() 及其线程安全保证【英文标题】:Statement.cancel() and its thread-safety guarantee(s) 【发布时间】:2011-01-04 15:33:10 【问题描述】:

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

javadoc 声明的唯一内容是Statement.cancel() 是thread-safe。 但是:

是否保证cancel() 将始终工作?(以某种方式当前正在执行Statement 的线程将立即解除阻塞并继续) 是否保证cancel() 不会阻塞并(或多或少)立即返回?

【问题讨论】:

至少对于 oracle jdbc 驱动程序没有这样的保证 - 特别是在网络或服务器端问题的情况下:download.oracle.com/docs/cd/E11882_01/java.112/e16548/… 【参考方案1】:

是否保证 cancel() 将始终有效?

没有。至少在我的经验中不是。我想我什至不得不处理简单地抛出 UnsupportedOperationException 的驱动程序

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

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

【讨论】:

是否可以设置取消进程的超时时间来严格杀死进程?我想了一个Statement.cancel(int timeout) 方法,但我没有找到一个;)【参考方案2】:

来自同一个 javadoc:

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

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

所以取消真的应该是线程安全的,但你必须询问你的实际驱动程序/DBMS 的供应商。

【讨论】:

以上是关于Statement.cancel() 及其线程安全保证的主要内容,如果未能解决你的问题,请参考以下文章

多线程的实现及其安全问题

Spring中获取request的几种方法,及其线程安全性分析

Spring 中获取 request 的几种方法,及其线程安全性分析

Spring中如何获取request的方法汇总及其线程安全性分析

Servlet第二篇Servlet实现线程安全及其他细节补充

Java中volatile关键字及其作用是什么?