我想知道是否可以直接使用jOOQ执行异步删除或更新查询。
dslContext.delete(MY_TABLE).where(...).execute();
我只能在 ResultQuery 中找到异步获取的方法
resultQuery.fetchLater();
是否有捷径可寻?
请注意,从 jOOQ 3.10 开始,由于 jOOQ 仍然依赖 JDBC,“异步”调用只是将阻塞的 JDBC 调用异步委托给某个执行程序,但该执行程序仍会阻塞 JDBC 连接。
Oracle 目前正在开发一种新的、真正异步的 API,以补充 JDBC。一旦稳定下来,jOOQ 也会适应它,并且能够在数据库中真正异步地运行语句。
同时...
jOOQ 3.8 引入了对 Java 8 的支持CompletionStage
。您现在可以运行:
CompletionStage<Integer> completion = ctx.delete(MY_TABLE).where(...).executeAsync();
您还可以选择将 an 传递Executor
给该executeAsync()
方法。
使用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 已弃用该方法。