30

有没有办法过早中止交易?比如说,我已经向数据库发送了一个运行五分钟的命令,四分钟后,我想中止它。

JDBC 是否定义了一种向数据库发送“停止您在此连接上所做的任何事情”信号的方法?

4

4 回答 4

37

正如 james 所提到的,Statement.cancel()将取消正在运行的 Statement(选择、更新等)的执行。JDBC 文档特别指出 Statement.cancel() 从另一个线程运行是安全的,甚至建议在超时线程中调用它。

取消语句后,您仍然需要回滚事务。这没有记录为从另一个线程运行是安全的。Connection.rollback()应该发生在执行所有其他 JDBC 调用的主线程中。您可以在取消的 Statement.execute...() 调用以 JDBCException(由于取消)完成后处理该问题。

于 2008-11-17T18:35:12.800 回答
17

我猜你想要做的是防止你的应用程序阻塞长时间运行的查询/事务。为此,JDBC 支持查询超时的概念。您可以使用以下方法设置查询超时:

java.sql.Statement.setQueryTimeout(seconds)

并通过回滚事务来处理方法SQLException抛出的问题(当然,只有当您将 autocommit 设置为 false 并且您的 JDBC 驱动程序支持 Statement.cancel() 时,这才有效)。execute()

于 2008-11-17T15:52:50.460 回答
7

查看 Statement.cancel()。

于 2008-11-17T18:09:04.850 回答
-5

不,您不能使用标准 JDBC 中止它。

您可能会尝试检查您的特定 RDBMS 是否定义了一些扩展来支持它。

于 2008-11-17T15:50:23.897 回答