6

jOOQを使用して非同期の削除または更新クエリを直接実行できるかどうか疑問に思っていました。

dslContext.delete(MY_TABLE).where(...).execute();

ResultQuery で非同期フェッチの方法を見つけることしかできませんでした

resultQuery.fetchLater();

これを行う簡単な方法はありますか?

4

1 に答える 1

7

jOOQ 3.10 の時点で、jOOQ はまだ JDBC に依存しているため、「非同期」呼び出しは、ブロックしている JDBC 呼び出しを何らかのエグゼキューターに非同期的に委譲するだけですが、そのエグゼキューターは JDBC 接続でブロックすることに注意してください。

Oracle は現在、JDBC を補完する新しい真の非同期 API に取り組んでいます。それが安定すると、jOOQ もそれに適応し、データベース内で真に非同期でステートメントを実行できるようになります。

その間...

Post Java 8 / post jOOQ 3.8 ソリューション

jOOQ 3.8 では、Java 8 のサポートが導入されましCompletionStageた。次のコマンドを実行できます。

CompletionStage<Integer> completion = ctx.delete(MY_TABLE).where(...).executeAsync();

オプションで をメソッドに渡すこともできExecutorますexecuteAsync()

Java 8 より前 / jOOQ 3.8 より前のソリューション

jOOQで非同期クエリを実行する 1 つの方法は、Java 独自の同時実行 API を使用することです。たとえば、次のコードを記述できます。

final Query query = dslContext.delete(MY_TABLE).where(...);

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(new Callable<Integer>() {
    @Override
    public Integer call() {
        return query.execute();            
    }
});

#2581fetchLater()の時点で、このメソッドは jOOQ 3.2 で廃止されたことに注意してください。

于 2013-09-06T12:05:02.463 に答える