当前位置: 首页 > 知识库问答 >
问题:

JDBC取消Oracle存储过程调用

景志
2023-03-14

我有一个非常复杂的oracle存储过程,它搜索和检索一些数据。该过程返回一个输出参数-oracle游标。我通过JDBC执行过程:

CallableStatement stmt = conn.prepareCall("{call myprocedure(?,?,?,?}");

问题是,查询有时会花费相当长的时间(几分钟),我希望用户能够通过单击按钮随时取消查询。我引用了stmt对象,但不幸的是(从其他线程)调用stmt.cancel()没有效果。

另一方面,当我将CallableStatement sql更改为以下查询时:

CallableStatement stmt = conn.prepareCall("select * from all_objects");

在调用stmt.cancel()之后,我得到“java.sql.sqlTimeoutException:ora-01013:user requested cancel of current Operation”-所以这是正确的反应。

这是否意味着我不能通过jdbc取消存储过程调用,而只能取消简单的select语句?有没有其他人也遇到过类似的问题并解决了?

我想我可以通过oracle kill session取消查询,但我使用连接池(jboss),并且我有大量针对同一用户的会话。

数据库产品版本为Oracle Database 11g Enterprise Edition Release 11.2.0.4.0-64bit Production JDBC Driver Version为11.2.0.4.0

任何帮助都将不胜感激。

共有1个答案

荆乐
2023-03-14

那个过程是只读的还是会写一些数据?尝试在db级别跟踪该会话并查看跟踪文件。您还可以检查该特定会话的v$undostat(已使用的撤消块)。OCIBreak调用不回滚会话,但可能回滚中断的语句。

即使您终止会话,它也不会立即终止。它只是有一个状态被杀死,它将回滚所有在它真正死亡之前。

如果v$undostat中的“Used undo Blocks”正在增加,那么会话“正在做某事”。如果它正在减少,则会话正在回滚,并且您没有其他选择,那么请等待它完成。

编辑:在OCI中,OCIBreak调用是作为带外数据包实现的。它在TCP报头中使用了一个特殊的字段。使用tcpdump可以很容易地识别这样的数据包。所以即使你没有必要的私服。在数据库端,您至少可以验证Break数据包是否已发送到数据库。

当您100%确定中断被发送到数据库时,您必须在db服务器端进行调查。我认为一些DDL语句,如“丢弃用户级联”是不能中断的。

 类似资料:
  • 主要内容:创建CallableStatement对象,关闭CallableStatement对象,JDBC SQL转义语法在讨论JDBC Statement教程文章时,我们已经学习了如何在JDBC中使用存储过程。 本教程文章与该部分类似,但它将讲解演示有关JDBC SQL转义语法的其他信息。 就像对象创建和对象一样,它可使用同样的方式创建对象,该对象将用于执行对数据库存储过程的调用。 创建CallableStatement对象 假设需要执行以下Oracle存储过程 - 注意:上面的存储过程是为O

  • 我创建了一个存储过程,如下所示: //mysql中的存储过程 并且我正在调用Java中的存储过程,如下所示: //使用JDBC调用存储过程 但它显示了一个编译时异常,如下所示: CAN在参数中为存储的函数调用的返回值设置。

  • 我需要对一个参数为PL/SQL表的过程进行JDBC调用。我正在尝试结构对象。但是我没有做正确的事情。我得到错误: ORA-04043:对象“斯科特”。“对象列表结构”不存在。 以下是代码片段: 参数“?”对于本程序,类型为: 我们非常感谢任何能让我们成功的见解谢谢

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 我是使用JDBC和MariaDB创建存储过程的初学者。当我创建过程时,我得到一个错误。我从昨天开始就遇到了这个问题: 到目前为止,我尝试了以下代码。我不知道是什么原因造成了这个错误。

  • 本文向大家介绍asp.net中调用oracle存储过程的方法,包括了asp.net中调用oracle存储过程的方法的使用技巧和注意事项,需要的朋友参考一下 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 存储过程是数