当前位置:  开发笔记 > 数据库 > 正文

当我在JDBC应用程序中调用PreparedStatement.cancel()时,它是否真的在Oracle数据库中将其删除?

如何解决《当我在JDBC应用程序中调用PreparedStatement.cancel()时,它是否真的在Oracle数据库中将其删除?》经验,为你挑选了2个好方法。

我有针对Oracle 10g数据库运行的Java JDBC应用程序.我设置了PreparedStatement来执行查询,然后调用ps.executeQuery()来运行它.有时查询需要很长时间,我需要将其删除.我有另一个线程访问PreparedStatement对象,并在其上调用cancel().

我的问题是,这实际上是否会破坏数据库中的查询?或者它只是从客户端切断它,并且查询仍然在Oracle的内部运行?

谢谢!



1> Alohci..:

请注意,我在下面所说的是基于对正在使用的Oracle的观察和推论,而不是基于对Oracle内部的深入理解.它们都不应被视为具有权威性.

ninesided在第一段中说的是正确的.但是,请注意测试建议.并非所有长时间运行的oracle查询都是相同的.似乎查询是通过两个阶段进行评估的,首先是一个阶段,它结合了足够的数据以了解如何以正确的顺序返回行,第二个阶段返回填充其未在第一阶段.两个阶段之间的工作分工也受基于成本的优化器设置的影响.例如,第一行与全行.

现在,如果查询处于阶段1,则取消请求最好排队等待在阶段1结束时应用,这意味着查询继续运行.

在阶段2中,行以串联形式返回,并且在每个束之后,cancel命令可以生效,因此假设驱动程序支持该命令,取消请求将导致查询被终止.

JDBC取消命令的规范似乎没有说明如果查询没有停止运行会发生什么,因此命令可能会等待确认kill,或者可能超时并返回查询仍在运行.



2> John M..:

答案是,这是一个实施质量问题.如果你看一下Statement.cancel()的javadoc,它会说如果DBMS和驱动程序都支持中止一个SQL语句就会发生这种情况".

根据我使用各种版本的Oracle JDBC驱动程序的经验,Statement.cancel()似乎可以满足您的需求.查询似乎在取消时立即停止执行.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有