有没有办法过早中止交易?比如说,我已经向数据库发送了一个运行五分钟的命令,四分钟后,我想中止它。
JDBC 是否定义了一种向数据库发送“停止您在此连接上所做的任何事情”信号的方法?
正如 james 所提到的,Statement.cancel()将取消正在运行的 Statement(选择、更新等)的执行。JDBC 文档特别指出 Statement.cancel() 从另一个线程运行是安全的,甚至建议在超时线程中调用它。
取消语句后,您仍然需要回滚事务。这没有记录为从另一个线程运行是安全的。Connection.rollback()应该发生在执行所有其他 JDBC 调用的主线程中。您可以在取消的 Statement.execute...() 调用以 JDBCException(由于取消)完成后处理该问题。
我猜你想要做的是防止你的应用程序阻塞长时间运行的查询/事务。为此,JDBC 支持查询超时的概念。您可以使用以下方法设置查询超时:
java.sql.Statement.setQueryTimeout(seconds)
并通过回滚事务来处理方法SQLException
抛出的问题(当然,只有当您将 autocommit 设置为 false 并且您的 JDBC 驱动程序支持 Statement.cancel() 时,这才有效)。execute()
查看 Statement.cancel()。
不,您不能使用标准 JDBC 中止它。
您可能会尝试检查您的特定 RDBMS 是否定义了一些扩展来支持它。