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的方法汇总及其线程安全性分析