【问题标题】:jOOQ, asynchronous execution of QueryjOOQ,Query的异步执行
【发布时间】:2013-09-09 18:22:40
【问题描述】:

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

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

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

resultQuery.fetchLater();

有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

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

    Oracle is currently working on a new, truly asynchronous API that complements JDBC。一旦稳定下来,jOOQ 也会适应它,并且能够在数据库中真正异步地运行语句。

    同时...

    发布 Java 8 / 发布 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 中弃用。

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2020-05-22
      • 2012-02-05
      • 2017-11-14
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多