Java JDBC取消Oracle存储过程调用

Java JDBC取消Oracle存储过程调用,java,oracle,stored-procedures,jdbc,oracle11g,Java,Oracle,Stored Procedures,Jdbc,Oracle11g,我有一个非常复杂的oracle存储过程,用于搜索和检索一些数据。该过程返回一个输出参数—oracle游标。 我通过JDBC执行该过程: CallableStatement stmt = conn.prepareCall("{call myprocedure(?,?,?,?}"); 问题是,查询有时可能需要很长时间(几分钟),我希望用户能够通过单击按钮随时取消查询。 我引用了stmt对象,但不幸的是调用stmt.cancel()(从其他线程)没有效果 另一方面,当我将CallableStatem

我有一个非常复杂的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会话取消查询,但我使用连接池(jboss),并且我有很多会话供同一用户使用

数据库产品版本为Oracle Database 11g Enterprise Edition 11.2.0.4.0版-64位产品 JDBC驱动程序版本是11.2.0.4.0


任何帮助都将不胜感激。

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

即使杀死会话,它也不会立即死亡。它只是有状态被杀死,它会在它真正死之前回滚所有东西

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

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


当您100%确定中断已发送到数据库时,则必须在db服务器端进行调查。我认为有些DDL语句,如“drop user cascade”不能被中断。

我也有同样的问题。你找到解决办法了吗?