【发布时间】:2013-09-09 18:22:40
【问题描述】:
我想知道是否可以直接使用jOOQ 执行异步删除或更新查询。
dslContext.delete(MY_TABLE).where(...).execute();
我只能在 ResultQuery 中找到异步获取的方法
resultQuery.fetchLater();
有没有简单的方法可以做到这一点?
【问题讨论】:
我想知道是否可以直接使用jOOQ 执行异步删除或更新查询。
dslContext.delete(MY_TABLE).where(...).execute();
我只能在 ResultQuery 中找到异步获取的方法
resultQuery.fetchLater();
有没有简单的方法可以做到这一点?
【问题讨论】:
请注意,从 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 中弃用。
【讨论】: