6

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

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

我只能在 ResultQuery 中找到异步获取的方法

resultQuery.fetchLater();

是否有捷径可寻?

4

1 回答 1

7

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

Oracle 目前正在开发一种新的、真正异步的 API,以补充 JDBC。一旦稳定下来,jOOQ 也会适应它,并且能够在数据库中真正异步地运行语句。

同时...

发布 Java 8 / 发布 jOOQ 3.8 解决方案

jOOQ 3.8 引入了对 Java 8 的支持CompletionStage。您现在可以运行:

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

您还可以选择将 an 传递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();            
    }
});

请注意,从#2581fetchLater()开始,jOOQ 3.2 已弃用该方法。

于 2013-09-06T12:05:02.463 回答