我想知道是否可以直接使用jOOQ执行异步删除或更新查询。
dslContext.delete(MY_TABLE).where(...).execute();
我只能在ResultQuery
中找到异步提取的方法resultQuery.fetchLater();
有一种简单的方法吗?
答案 0 :(得分:6)
注意,从jOOQ 3.10开始,由于jOOQ仍然依赖于JDBC,“异步”调用只是异步地将阻塞JDBC调用委托给某个执行程序,但该执行程序仍然会阻止JDBC连接。
Oracle is currently working on a new, truly asynchronous API that complements JDBC。一旦稳定,jOOQ也将适应它,并且能够在数据库中真正异步地运行语句。
...同时
jOOQ 3.8引入了对Java 8 CompletionStage
的支持。您现在可以运行:
CompletionStage<Integer> completion = ctx.delete(MY_TABLE).where(...).executeAsync();
您还可以选择将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();
}
});
请注意fetchLater()
方法在#2581之后已被jOOQ 3.2弃用。