响应式编程之数据访问:ADBA与R2DBC

这个世界在变,技术也一直在变化着。JDBC具有阻塞性 - 没有什么可以减轻JDBC的阻塞性质,什么时候可以使用API​​进行响应性关系数据库集成?先用有Oracle宣布推出ADBA,再有在 SpringOne平台华盛顿大会上宣布的 R2DBC,用于针对关系型数据库进行反应式编程。最终目标是试图影响 ADBA规范。

R2DBC的设计原则是基于以下四个原则:

  1. 利用反应式流类型和模式
  2. 访问数据库的整个过程完全非阻塞
  3. 把驱动SPI压缩为专门实现的最小操作集,且不管可用性
  4. 基于驱动SPI实现多个“人性化”的API

R2DBC及其生态系统仍然很年轻,并要求进行实验和反馈以收集用例,并查看反应性关系数据库集成是否有意义。ADBA的目标是包含在Java标准版运行时中,根据当前的时间表,我预计它将在早于2021年的Java 17中出现。截至目前,有三种驱动程序实现:

  • PostgreSQL
  • H2
  • Microsoft SQL Server

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进行了支持。

Spring Data R2DBC Examples

客户端API提功能:

  • 执行通用SQL并消耗更新计数/行结果。
  • 具有分页和排序的通用SELECT。
  • SELECT具有分页和排序的映射对象。
  • 带参数绑定的通用INSERT。
  • INSERT映射对象。
  • 使用本机语法进行参数绑定。
  • 结果消耗:更新计数,未映射(Map ),映射到实体,提取功能。
  • 使用@Query注释方法的反应式存储库。
  • 事务管理。
//PostgreSQL
PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(PostgresqlConnectionConfiguration.builder()
		.host(…)
		.database(…)
		.username(…)
		.password(…).build());
 
DatabaseClient client = DatabaseClient.create(connectionFactory);
 
Mono affectedRows = client.execute()
        .sql("UPDATE person SET name = 'Joe'")
        .fetch().rowsUpdated();
 
Flux all = client.execute()
        .sql("SELECT id, name FROM person")
        .as(Person.class)
        .fetch().all();

R2DBC是一个实验场,虽然它足够稳定可以使用,但绝对不能用于生产环境。

你可能感兴趣的:(Java,响应式编程)