jOOQ,Query的异步执行

时间:2013-09-05 19:29:01

标签: java sql jooq

我想知道是否可以直接使用jOOQ执行异步删除或更新查询。

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

我只能在ResultQuery

中找到异步提取的方法
resultQuery.fetchLater();

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:6)

注意,从jOOQ 3.10开始,由于jOOQ仍然依赖于JDBC,“异步”调用只是异步地将阻塞JDBC调用委托给某个执行程序,但该执行程序仍然会阻止JDBC连接。

Oracle is currently working on a new, truly asynchronous API that complements JDBC。一旦稳定,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()方法。

Pre Java 8 / pre jOOQ 3.8解决方案

使用jOOQ执行异步查询的一种方法是使用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();            
    }
});

请注意fetchLater()方法在#2581之后已被jOOQ 3.2弃用。