web-dev-qa-db-ja.com

実行中のJDBCトランザクションを中止するにはどうすればよいですか?

トランザクションを途中で中止する方法はありますか?たとえば、5分後に実行されるコマンドをデータベースに送信し、4分後にそれを中止したいとします。

JDBCは、「この接続で行っていることをすべて停止する」信号をDBに送信する方法を定義していますか?

27
Aaron Digulla

Jamesが述べたように、 Statement.cancel() は、実行中のステートメント(select、updateなど)の実行をキャンセルします。 JDBCのドキュメントでは、Statement.cancel()は別のスレッドから安全に実行できると具体的に述べており、タイムアウトスレッドで呼び出す方法も提案されています。

ステートメントをキャンセルした後も、トランザクションをロールバックする作業はまだ続きます。つまり、notは、別のスレッドから安全に実行できると文書化されています。 Connection.rollback() は、他のすべてのJDBC呼び出しを実行するメインスレッドで発生する必要があります。キャンセルされたStatement.execute ...()呼び出しがJDBCExceptionで完了した後(キャンセルのため)、これを処理できます。

33
John M

私はあなたがしたいことは、長時間実行されているクエリ/トランザクションでアプリケーションがブロックされないようにすることだと思います。この目的のために、JDBCはクエリタイムアウトの概念をサポートしています。これを使用してクエリタイムアウトを設定できます。

_Java.sql.Statement.setQueryTimeout(seconds)
_

そして、トランザクションをロールバックすることにより、execute()メソッドによってスローされたSQLExceptionを処理します(もちろん、autocommitがfalseに設定されていて、JDBCドライバーがStatement.cancel( ))。

14
Gowri

Statement.cancel()を確認してください。

5
james