【发布时间】:2015-04-20 11:19:44
【问题描述】:
我有一个非常复杂的 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: 用户请求取消当前操作” - 所以这是正确的反应。
这是否意味着我不能通过 jdbc 取消存储过程调用,而只能取消简单的 select 语句? 有没有其他人遇到过并解决过类似的问题?
我想我可以通过 oracle kill session 取消查询,但我使用连接池 (jboss),并且我有很多会话可供同一用户使用。
数据库产品版本是 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production JDBC 驱动程序版本为 11.2.0.4.0
我们将不胜感激。
【问题讨论】:
-
我也有同样的问题。你找到解决办法了吗?
标签: java oracle stored-procedures jdbc oracle11g