30

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

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

4

4 に答える 4

37

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

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

于 2008-11-17T18:35:12.800 に答える
17

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

java.sql.Statement.setQueryTimeout(seconds)

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

于 2008-11-17T15:52:50.460 に答える
7

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

于 2008-11-17T18:09:04.850 に答える
-5

いいえ、標準のJDBCを使用して中止することはできません。

特定のRDBMSがそれをサポートするための拡張機能を定義しているかどうかを確認しようとするかもしれません。

于 2008-11-17T15:50:23.897 に答える