这个世界在变,技术也一直在变化着。JDBC具有阻塞性 - 没有什么可以减轻JDBC的阻塞性质,什么时候可以使用API进行响应性关系数据库集成?先用有Oracle宣布推出ADBA,再有在 SpringOne平台华盛顿大会上宣布的 R2DBC,用于针对关系型数据库进行反应式编程。最终目标是试图影响 ADBA规范。
R2DBC的设计原则是基于以下四个原则:
- 利用反应式流类型和模式
- 访问数据库的整个过程完全非阻塞
- 把驱动SPI压缩为专门实现的最小操作集,且不管可用性
- 基于驱动SPI实现多个“人性化”的API
R2DBC及其生态系统仍然很年轻,并要求进行实验和反馈以收集用例,并查看反应性关系数据库集成是否有意义。ADBA的目标是包含在Java标准版运行时中,根据当前的时间表,我预计它将在早于2021年的Java 17中出现。截至目前,有三种驱动程序实现:
R2DBC附带API规范(r2dbc-spi)和客户端(r2dbc-client),使SPI可用于应用程序。
Fibers的JDBC
虽然JDBC和其他技术暴露了阻塞API(主要是由于等待I / O),但Project Loom引入Fibers了轻量级抽象,将阻塞API转变为非阻塞API。一旦调用遇到阻塞API,就可以通过堆栈切换实现这一点。因此Fiber,继续使用阻塞API的先前流程的基础尝试。
Spring Data R2DBC
Spring Data R2DBC是更大的Spring Data系列的一部分,R2DBC代表Reactive Relational Database Connectivity,它是一个使用反应式驱动程序集成关系数据库的孵化器。Spring Data R2DBC旨在简化概念,为了实现这一点,它不提供缓存,延迟加载,后写或ORM框架的许多其他功能,它提供DatabaseClient作为应用程序的入口点,对PostgreSQL、H2、Microsoft SQL Server进行了支持。
客户端API提功能:
- 执行通用SQL并消耗更新计数/行结果。
- 具有分页和排序的通用SELECT。
- SELECT具有分页和排序的映射对象。
- 带参数绑定的通用INSERT。
- INSERT映射对象。
- 使用本机语法进行参数绑定。
- 结果消耗:更新计数,未映射(Map <String,Object>),映射到实体,提取功能。
- 使用@Query注释方法的反应式存储库。
- 事务管理。
//PostgreSQL
PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration.builder()
.host(…)
.database(…)
.username(…)
.password(…).build());
DatabaseClient client = DatabaseClient.create(connectionFactory);
Mono<Integer> affectedRows = client.execute()
.sql("UPDATE person SET name = 'Joe'")
.fetch().rowsUpdated();
Flux<Person> all = client.execute()
.sql("SELECT id, name FROM person")
.as(Person.class)
.fetch().all();
R2DBC是一个实验场,虽然它足够稳定可以使用,但绝对不能用于生产环境。