具有jOOQ和Java 8的CompletableFuture的异步SQL执行
响应式编程是一个新的流行词,它实际上仅表示异步编程或消息传递。
事实是,函数语法极大地帮助构建了异步执行链,今天,我们将看到如何使用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个执行块:
- 插入新作者的
- 再次获取同一作者的
- 重新插入新获取的AUTHOR的代码(引发异常)
- 一种忽略引发的异常并再次删除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执行相关推荐
- jooq 执行sql_使用jOOQ和Java 8的CompletableFuture进行异步SQL执行
jooq 执行sql 响应式编程是一个新的流行词,它实际上仅表示异步编程或消息传递. 事实是,函数语法极大地帮助构建了异步执行链,今天,我们将看到如何使用jOOQ和新的CompletableFutur ...
- Java 8 (10) CompletableFuture:组合式异步编程
随着多核处理器的出现,提升应用程序的处理速度最有效的方式就是可以编写出发挥多核能力的软件,我们已经可以通过切分大型的任务,让每个子任务并行运行,使用线程的方式,分支/合并框架(java 7) 和并行流 ...
- Java笔记(十七) 异步任务执行服务
异步任务执行服务 一.基本原理和概念 一)基本接口 1)Runnable和Callable:表示要执行的异步任务. 2)Executor和ExecutorService:表示执行服务. 3)Futur ...
- Java编程的逻辑 (77) - 异步任务执行服务
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- CompletableFuture源码详解之java.util.concurrent.CompletableFuture#runAsync(java.lang.Runnable)
CompletableFuture#runAsync方法是用来执行无返回结果的异步程序,当执行一大堆业务逻辑代码,而又不需要返回结果的时候,可以使用此方法异步执行,提升接口性能,方法源码如下: /** ...
- spring async_Spring Async和Java的8 CompletableFuture
spring async 众所周知,我不是Spring的最大粉丝,但是当时我在一个组织中工作,该组织使用Spring(以不同的形式和版本)维护了太多的项目. 我仍然对Spring持怀疑态度,当然有一些 ...
- Java 8:CompletableFuture与并行流
这篇文章展示了Java 8的CompletableFuture在执行异步计算时如何与并行流进行比较. 我们将使用以下类对长时间运行的任务进行建模: class MyTask {private fina ...
- Spring Async和Java的8 CompletableFuture
众所周知,我不是Spring的最大粉丝,但是当时我在一个组织中工作,该组织使用Spring(以不同的形式和版本)维护了太多的项目. 我仍然对Spring持怀疑态度,当然有一些很好的主意,有一些很好的( ...
- Java8 - 使用CompletableFuture 构建异步应用
文章目录 概述 同步API VS 异步API 同步的困扰 实现异步API 将同步方法改为异步方法 处理异常错误 概述 为了展示 CompletableFuture 的强大特性, 创建一个名为 best ...
最新文章
- 生命简史——跨越地球40亿年
- 成功解决ValueError: fill value must be in categories
- jzoj3920-噪音【贪心,dp】
- 和搜狗输入法快捷键冲突_这款输入法被调教多年不输搜狗,爱了奥里给!
- centos6.4 卸载mysql_彻底删除MYSQL-CENTOS
- linux bes二进制查看工具,Linux的命令及工具
- 逻辑卷管理和磁盘配额
- 易筋SpringBoot 2.1 | 第八篇:Mybatis访问MySQL
- 数据可视化案例(六)——智慧医院数据可视化
- ubuntu Nvidia dkms 驱动恢复
- DevExpress 控件中文化教程详解(内含下载官网中文化包和自定义修改中文化包制作教程)
- 【小猿說】以小刀会“的成败论当今创业成败
- THINKPHP框架的优秀开源系统推荐
- 20个非常有用的单行Python代码
- java mysql物联网土壤智能监控web前端+java后台+数据接程序
- RouterOS(ros)自动更新国内外IP以及端口扫描IP
- model.generate返回句子大于1时出现<unk>的情况处理
- 10-3 查找王姓同学不学的课程的课程号
- 【岩熹攻略】议息大会后,国庆主题迎布局良机!
- Java SpringBoot 表单提交Json提交 Star.hou
热门文章
- 当当网首页——CSS代码
- 在mysql中插入日期
- data layui table 排序_浅谈layui中table的sort排序
- windows监控txt写入_Windows的bug们
- ConcurrentHashMap--自用,非教学
- java获得电脑性能_Java:使用SingletonStream获得性能
- gc垃圾收集器 与gc算法_GC解释:收集器概述
- jsf netbeans_NetBeans Java EE技巧9:从数据库创建JSF应用程序
- intext:企业_企业中的微服务:敌是友?
- HelloWorld.java –打印Hello World的Java程序