响应式编程是一个新的流行词,它实际上仅表示异步编程或消息传递。

事实是,函数语法极大地帮助构建了异步执行链,今天,我们将看到如何使用jOOQ和新的CompletableFuture API在Java 8中做到这一点。

实际上,事情很简单:

// Initiate an asynchronous call chain
CompletableFuture// This lambda will supply an int value// indicating the number of inserted rows.supplyAsync(() -> DSL.using(configuration).insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME).values(3, "Hitchcock").execute())// This will supply an AuthorRecord value// for the newly inserted author.handleAsync((rows, throwable) -> DSL.using(configuration).fetchOne(AUTHOR, AUTHOR.ID.eq(3)))// This should supply an int value indicating// the number of rows, but in fact it'll throw// a constraint violation exception.handleAsync((record, throwable) -> {record.changed(true);return record.insert();})// This will supply an int value indicating// the number of deleted rows.handleAsync((rows, throwable) -> DSL.using(configuration).delete(AUTHOR).where(AUTHOR.ID.eq(3)).execute())// This tells the calling thread to wait for all// chained execution units to be executed.join();

这里真的发生了什么? 没有什么不寻常的。 有4个执行块:

  1. 插入新作者的
  2. 再次获取同一作者的
  3. 重新插入新获取的AUTHOR的代码(引发异常)
  4. 一种忽略引发的异常并再次删除AUTHOR的方法

最后,当执行链建立后,调用线程将使用CompletableFuture.join()方法加入整个链,该方法与Future.get()方法基本相同,不同之处在于它不会引发任何已检查的异常。

与其他API进行比较

诸如Scala的Slick之类的其他API也通过“标准API”实现了类似的功能,例如对flatMap()调用。 我们目前不会模仿这样的API,因为我们相信新的Java 8 API对于本机Java讲者来说将变得更加惯用。 特别是,在执行SQL时,正确实现连接池和事务至关重要。 异步链接的执行块的语义以及它们与事务的关系非常微妙。 如果您希望一个事务跨越多个这样的块,则必须自己通过jOOQ的Configuration及其包含的ConnectionProvider对其进行编码。

阻止JDBC

显然,此类解决方案始终存在一个障碍,那就是JDBC本身-很难将其转变为异步API。 实际上,很少有数据库真正支持异步查询执行和游标,因为大多数情况下,单个数据库会话一次只能由单个线程用于单个查询。

翻译自: https://www.javacodegeeks.com/2014/09/asynchronous-sql-execution-with-jooq-and-java-8s-completablefuture.html

具有jOOQ和Java 8的CompletableFuture的异步SQL执行相关推荐

  1. jooq 执行sql_使用jOOQ和Java 8的CompletableFuture进行异步SQL执行

    jooq 执行sql 响应式编程是一个新的流行词,它实际上仅表示异步编程或消息传递. 事实是,函数语法极大地帮助构建了异步执行链,今天,我们将看到如何使用jOOQ和新的CompletableFutur ...

  2. Java 8 (10) CompletableFuture:组合式异步编程

    随着多核处理器的出现,提升应用程序的处理速度最有效的方式就是可以编写出发挥多核能力的软件,我们已经可以通过切分大型的任务,让每个子任务并行运行,使用线程的方式,分支/合并框架(java 7) 和并行流 ...

  3. Java笔记(十七) 异步任务执行服务

    异步任务执行服务 一.基本原理和概念 一)基本接口 1)Runnable和Callable:表示要执行的异步任务. 2)Executor和ExecutorService:表示执行服务. 3)Futur ...

  4. Java编程的逻辑 (77) - 异步任务执行服务

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  5. CompletableFuture源码详解之java.util.concurrent.CompletableFuture#runAsync(java.lang.Runnable)

    CompletableFuture#runAsync方法是用来执行无返回结果的异步程序,当执行一大堆业务逻辑代码,而又不需要返回结果的时候,可以使用此方法异步执行,提升接口性能,方法源码如下: /** ...

  6. spring async_Spring Async和Java的8 CompletableFuture

    spring async 众所周知,我不是Spring的最大粉丝,但是当时我在一个组织中工作,该组织使用Spring(以不同的形式和版本)维护了太多的项目. 我仍然对Spring持怀疑态度,当然有一些 ...

  7. Java 8:CompletableFuture与并行流

    这篇文章展示了Java 8的CompletableFuture在执行异步计算时如何与并行流进行比较. 我们将使用以下类对长时间运行的任务进行建模: class MyTask {private fina ...

  8. Spring Async和Java的8 CompletableFuture

    众所周知,我不是Spring的最大粉丝,但是当时我在一个组织中工作,该组织使用Spring(以不同的形式和版本)维护了太多的项目. 我仍然对Spring持怀疑态度,当然有一些很好的主意,有一些很好的( ...

  9. Java8 - 使用CompletableFuture 构建异步应用

    文章目录 概述 同步API VS 异步API 同步的困扰 实现异步API 将同步方法改为异步方法 处理异常错误 概述 为了展示 CompletableFuture 的强大特性, 创建一个名为 best ...

最新文章

  1. R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型、构建融合(集成)预测模型、使用融合模型进行预测推理
  2. LETTers比赛第七场 Guess the Numbers
  3. 如何检测ARP病毒,arp病毒怎么解决?
  4. 2021 整理的最全学习资源,送给每一个努力着的人
  5. C语言中的三目运算符是啥?有何用处?
  6. [vue] watch的属性用箭头函数定义结果会怎么样?
  7. nlp3-有限自动机FLandFA
  8. 四参数拟合曲线_每周放送|曲线拟合
  9. 互联网日报 | 6月12日 星期六 | BOSS直聘正式登陆纳斯达克;腾讯回应“试点强制6点下班”;数据安全法9月1日起实施...
  10. 如何避免核心代码资源泄漏和如何提高开发效率
  11. Oracle树反向查询的优化(转载)
  12. k8s使用glusterfs实现动态持久化存储
  13. 关于图书馆占座问题的调查
  14. 在线文本比较工具(用来对比两个代码文件差异的地方)
  15. Java创建Excel文档(自定义格式)
  16. 矩形类定义【C++】
  17. 带声调的拼音转拼音+数字
  18. ayit第十周训练g题
  19. 前端 img标签显示 base64格式的 图片
  20. matlab 图片最多显示几张_matlab在一个figure中显示多幅图像

热门文章

  1. 2018蓝桥杯省赛---java---B---2(方格计数)
  2. ./NISwGSP: error while loading shared libraries: libopencv_stitching.so.3.0: cannot open shared obje
  3. Spark SQL UDF2的使用
  4. 系统架构设计师考试 重要的部分
  5. Myeclipse 创建web项目的一些基本操作
  6. oracle中闪回和回滚,oracle闪回操作详解
  7. python大神交流网站_学习Python必去的8个网站
  8. Java之Socket与HTTP区别
  9. java生产者实现kafka拦截器
  10. 转:Tomcat启动失败 提示Server Tomcat v7.0 Server at localhost failed to start.六种解决方法