SlideShare a Scribd company logo
1 of 36
Download to read offline
Full Steam Ahead!
Mark Paluch • Spring Data Project Lead, R2DBC Contributor • @mp911de
Reactive Relational Database Connectivity
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mark Paluch
● Spring Data, R2DBC,
Lettuce Redis Driver
● All things non-blocking
● @mp911de (Twitter, GitHub)
3
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 4
2009
Microsoft to release .NET 4.0
2013
Reactive Manifesto
Initial Akka release
2014
RxJava 1.0
2015
Reactive Streams 1.0
Project Reactor 2.0
2016
RxJava 2.0
Akka Streams 1.0
Ratpack
Spring WebFlux
Micronaut
Today
RSocket
Reactive Mongo
Lettuce
Cassandra
vert.x
Lagom
Apple Servicetalk
Helidon
RxJava 3.0
Project Reactor 3.0
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Programming Models Have Changed
● Reactive applications typically stream-processing
● Push-based models
● Notifications, Events
● Is SQL the right choice for reactive applications?
● Depends on the Use-Case
5
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Programming
● High-efficiency applications
● Fundamentally non-blocking
● No opinion on async
● Key differentiators: (pull-push) back pressure, flow control
6
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Persistence
● ✅ Kafka
● ✅ MongoDB
● ✅ Cassandra
● ✅ Couchbase
● ✅ Redis
● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server*
7
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Persistence
● ✅ Kafka
● ✅ MongoDB
● ✅ Cassandra
● ✅ Couchbase
● ✅ Redis
● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server*
8
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non-blocking SQL Persistence (1/3)
● MySQL: X DevAPI (Document Store API): CompletableFuture
● vert.x Postgres Driver: Callback API
● jasync-sql: CompletableFuture
● Common API 🤕
9
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non-blocking SQL Persistence (2/3)
● JDBC on ThreadPool
● RxJava JDBC
● Blocks still threads
● Project Loom: Production readiness unknown
● Requires proper queuing and capacity controls
10
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non-blocking SQL Persistence (3/3)
● ADBA (Asynchronous Database API)
● Standard-API
● Based heavily on CompletableFuture
● Discontinued in favor of Project Loom
11
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 12
Standard API
for reactive programming
with SQL databases
on the JVM
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Project of
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Design Principles
● Embrace Reactive Types and Patterns
● Low barrier to entry (depends on Reactive Streams and Java 8 only)
● Non-blocking, all the way to the database
● De-duplicate driver efforts
● Documented specification
● Shrink the driver SPI
● Enable multiple "humane" APIs
14
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Simple Select
15
Publisher<String> values = connectionFactory.create()
.flatMapMany(conn ->
conn.createStatement("SELECT value FROM test")
.execute()
.flatMap(result ->
result.map((row, metadata) -> row.get("value",
String.class))))
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC 0.8
● Stable release
● End-to-end reactive non-blocking database communication
● Batching
● BLOB/CLOB
● Extensive Type Conversion
● Savepoints
● Transactions
● Leveraging Database-specific features
● ServiceLoader-based Driver discovery
● Connection URLs
● Categorized exceptions (Bad grammar, Data integrity violation, …)
16
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC 0.9 / 1.0
● Evolution of the specification
● Extended transaction spec
● Improved In/Out Parameter Bindings
● Investigation on stored procedures
● No real demand so far
● Scheduled for 2021
17
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC Ecosystem
● Specification document
● R2DBC SPI
● R2DBC Proxy
● Connection Pooling
● Client Implementations
● Spring
● Querydsl
● R2DBC Migrate
● Kotysa
● Testcontainers
● Driver Community
● Google Cloud Spanner
● H2
● Microsoft SQL Server
● MySQL Driver (r2dbc-mysql,
jasync-sql)
● MariaDB
● PostgreSQL
● SAP Hana
● Oracle (work in progress)
● DB2 (work in progress)
18
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Community Projects
● Specification document
● R2DBC SPI
● R2DBC Proxy
● Connection Pooling
● Client Implementations
● Spring
● Querydsl
● R2DBC Migrate
● Kotysa
● Testcontainers
● Driver Community
● Google Cloud Spanner
● H2
● Microsoft SQL Server
● MySQL Driver (r2dbc-mysql,
jasync-sql)
● MariaDB
● PostgreSQL
● SAP Hana
● Oracle (work in progress)
● DB2 (work in progress)
19
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC Clients: Work in Progress
● MyBatis (#1444)
● JDBI (#1454)
● jOOQ (#6298)
● Querydsl (#2468)
● Liquibase (CORE-3419)
● Flyway (#2502)
● Exposed (#456)
● Micronaut (#416)
● Go vote for a client you want to see happen.
20
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
What R2DBC gives you
● Move Thread congestion out of JVM
● Achieve more with less Threads
● Doesn’t change law of physics
● Follow well-known SQL database interaction patterns
● Database laws still apply
● Obey wire protocol rules
● ACID rules
21
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring ❤ R2DBC
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring and R2DBC
● 2018/2019
● First steps with Spring Data R2DBC 1.0
● 2020
● Migration of core R2DBC support from Spring Data to Spring
Framework 5.3
● Deprecations in Spring Data R2DBC 1.2
23
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring R2DBC
● Central class: DatabaseClient
● BindMarker SPI
● Reactive Transaction Manager
● Schema initialization support
● ConnectionFactory implementations (e.g.
AbstractRoutingConnectionFactory)
24
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DatabaseClient
DatabaseClient client = DatabaseClient.create(connectionFactory);
Flux<Person> people = client
	 	 .sql("SELECT firstname, lastname FROM person WHERE age > :age")
	 	 .bind("age", 42)
.filter(statement -> statement.fetchSize(20))
	 	 .map(row -> new Person(row.get("firstname", String.class),
row.get("lastname", String.class)))
	 	 .all();
25
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ConnectionFactoryInitializer
@Bean
ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) {
	 ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
	 initializer.setConnectionFactory(connectionFactory);
	 initializer.setDatabasePopulator(new ResourceDatabasePopulator(
new ClassPathResource("schema.sql")));
	 return initializer;
}
26
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Data R2DBC
● Mapped entity support through R2dbcEntityOperations
● Query and Update objects
● Dialect-awareness
● Repository abstraction
● Sorry, no mapped relations yet
27
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2dbcEntityTemplate
R2dbcEntityTemplate entityTemplate = …;
Flux<Person> people = entityTemplate.select(Person.class)
	 	 .from("people")
	 	 .matching(query(where("age").greaterThan(42))
.limit(10)
.offset(20)
.sort(by("firstname")))
	 	 .all();
28
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2dbcEntityTemplate
R2dbcEntityTemplate entityTemplate = …;
Flux<Person> people = entityTemplate.select(Person.class)
	 	 .from("people")
	 	 .matching(query(where("age").greaterThan(42))
.limit(10)
.offset(20)
.sort(by("firstname")))
	 	 .all();
29
query(where("age").greaterThan(42))
.limit(10)
.offset(20)
.sort(by("firstname"))
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Repositories
interface PersonRepository extends ReactiveSortingRepository<Person, Integer> {
	 Flux<Person> findByFirstnameContains(String name);
	 Flux<Person> findFirst10By();
	 Flux<Person> findAllByOrderByLastname(Pageable pageable);
	 @Modifying
	 @Query("DELETE FROM person WHERE age = :age")
	 Mono<Void> deleteAllByAge(int age);
	 @Modifying
	 @Query("DELETE FROM person")
	 Mono<Integer> deleteAllAndReturnCount();
}
30
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Data R2DBC 1.2: New and Noteworthy
● Entity Callbacks
● Before/After Convert, Before/After Save
● Auditing
● SpEL Context Extensions
● Enum value revision
● Repository metrics SPI
31
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Entity Callbacks
@FunctionalInterface
interface BeforeConvertCallback<T> extends EntityCallback<T> {
Publisher<T> onBeforeConvert(T entity, SqlIdentifier table);
}
32
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Entity Callback in Action
@Bean
BeforeConvertCallback<Person> autogeneratedId(DatabaseClient client) {
return (entity, table) -> {
if (entity.getId() == null) {
return client.sql("SELECT nextval('person_seq')")
.map(row -> row.get(0, Integer.class))
.first()
.map(entity::withId);
}
return Mono.just(entity);
};
}
33
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Outlook: Spring Data R2DBC 2.0
● Closer alignment of Spring Data JDBC and Spring Data R2DBC
● Evolution of Spring Data Relational
34
Thank you.
r2dbc.io
@mp911de
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Resources
● Website
https://r2dbc.io
● Twitter
@r2dbc
● GitHub
https://github.com/r2dbc
● Mailing List
https://groups.google.com/forum/
#!forum/r2dbc
● Monthly Call
1st Friday of Month
0630 PT/0930 ET/1530 CET
36

More Related Content

What's hot

What's hot (20)

Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
Spring Cloud Function: Where We Were, Where We Are, and Where We’re GoingSpring Cloud Function: Where We Were, Where We Are, and Where We’re Going
Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
 
Spring Boot on Amazon Web Services with Spring Cloud AWS
Spring Boot on Amazon Web Services with Spring Cloud AWSSpring Boot on Amazon Web Services with Spring Cloud AWS
Spring Boot on Amazon Web Services with Spring Cloud AWS
 
Spring Boot Observability
Spring Boot ObservabilitySpring Boot Observability
Spring Boot Observability
 
Spring Data JDBC: Beyond the Obvious
Spring Data JDBC: Beyond the ObviousSpring Data JDBC: Beyond the Obvious
Spring Data JDBC: Beyond the Obvious
 
State of Steeltoe 2020
State of Steeltoe 2020State of Steeltoe 2020
State of Steeltoe 2020
 
Spring Native and Spring AOT
Spring Native and Spring AOTSpring Native and Spring AOT
Spring Native and Spring AOT
 
Introducing Spring Cloud Gateway and API Hub for VMware Tanzu
Introducing Spring Cloud Gateway and API Hub for VMware TanzuIntroducing Spring Cloud Gateway and API Hub for VMware Tanzu
Introducing Spring Cloud Gateway and API Hub for VMware Tanzu
 
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
 
Micronaut: A new way to build microservices
Micronaut: A new way to build microservicesMicronaut: A new way to build microservices
Micronaut: A new way to build microservices
 
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
 
Spring: Your Next Java Micro-Framework
Spring: Your Next Java Micro-FrameworkSpring: Your Next Java Micro-Framework
Spring: Your Next Java Micro-Framework
 
Walking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data FlowWalking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data Flow
 
Improving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware TakeoutImproving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware Takeout
 
The Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsThe Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native Applications
 
From Monolith to K8s - Spring One 2020
From Monolith to K8s - Spring One 2020From Monolith to K8s - Spring One 2020
From Monolith to K8s - Spring One 2020
 
What’s New in Spring Data MongoDB
What’s New in Spring Data MongoDBWhat’s New in Spring Data MongoDB
What’s New in Spring Data MongoDB
 
Spring Boot—Production Boost
Spring Boot—Production BoostSpring Boot—Production Boost
Spring Boot—Production Boost
 
Peering Inside the Black Box: A Case for Observability
Peering Inside the Black Box: A Case for ObservabilityPeering Inside the Black Box: A Case for Observability
Peering Inside the Black Box: A Case for Observability
 
Developers Are Users, Too
Developers Are Users, TooDevelopers Are Users, Too
Developers Are Users, Too
 
Ingress? That’s So 2020! Introducing the Kubernetes Gateway API
Ingress? That’s So 2020! Introducing the Kubernetes Gateway APIIngress? That’s So 2020! Introducing the Kubernetes Gateway API
Ingress? That’s So 2020! Introducing the Kubernetes Gateway API
 

Similar to Full Steam Ahead, R2DBC!

Similar to Full Steam Ahead, R2DBC! (20)

Spring Update | July 2023
Spring Update | July 2023Spring Update | July 2023
Spring Update | July 2023
 
Modernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxModernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptx
 
Modernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxModernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptx
 
Reactive Web Applications
Reactive Web ApplicationsReactive Web Applications
Reactive Web Applications
 
Developing Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache KafkaDeveloping Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache Kafka
 
Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015
 
Angular (v2 and up) - Morning to understand - Linagora
Angular (v2 and up) - Morning to understand - LinagoraAngular (v2 and up) - Morning to understand - Linagora
Angular (v2 and up) - Morning to understand - Linagora
 
JDBC, What Is It Good For?
JDBC, What Is It Good For?JDBC, What Is It Good For?
JDBC, What Is It Good For?
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
 
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
 
Spring Boot 3 And Beyond
Spring Boot 3 And BeyondSpring Boot 3 And Beyond
Spring Boot 3 And Beyond
 
CISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 DevelopmentCISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 Development
 
Connecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
Connecting your .Net Applications to NoSQL Databases - MongoDB & CassandraConnecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
Connecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
 
Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)
 
The New MariaDB Offering: MariaDB 10, MaxScale and More
The New MariaDB Offering: MariaDB 10, MaxScale and MoreThe New MariaDB Offering: MariaDB 10, MaxScale and More
The New MariaDB Offering: MariaDB 10, MaxScale and More
 
Consumer Driven Contracts and Your Microservice Architecture
Consumer Driven Contracts and Your Microservice ArchitectureConsumer Driven Contracts and Your Microservice Architecture
Consumer Driven Contracts and Your Microservice Architecture
 
Client vs Server Templating: Speed up initial load for SPA with Angular as an...
Client vs Server Templating: Speed up initial load for SPA with Angular as an...Client vs Server Templating: Speed up initial load for SPA with Angular as an...
Client vs Server Templating: Speed up initial load for SPA with Angular as an...
 
Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
 Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1... Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
 
The Future Is The Cloud
The Future Is The CloudThe Future Is The Cloud
The Future Is The Cloud
 
High performance stream processing
High performance stream processingHigh performance stream processing
High performance stream processing
 

More from VMware Tanzu

More from VMware Tanzu (20)

What AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItWhat AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About It
 
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023
 
Enhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleEnhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at Scale
 
Platforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductPlatforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a Product
 
Building Cloud Ready Apps
Building Cloud Ready AppsBuilding Cloud Ready Apps
Building Cloud Ready Apps
 
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptx
 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - French
 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - English
 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - English
 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - French
 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software Engineer
 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs Practice
 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
 
SpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your TeamSpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your Team
 
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
 

Recently uploaded

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 

Recently uploaded (20)

%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban%in Durban+277-882-255-28 abortion pills for sale in Durban
%in Durban+277-882-255-28 abortion pills for sale in Durban
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
%in Lydenburg+277-882-255-28 abortion pills for sale in Lydenburg
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 

Full Steam Ahead, R2DBC!

  • 1. Full Steam Ahead! Mark Paluch • Spring Data Project Lead, R2DBC Contributor • @mp911de
  • 3. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mark Paluch ● Spring Data, R2DBC, Lettuce Redis Driver ● All things non-blocking ● @mp911de (Twitter, GitHub) 3
  • 4. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 4 2009 Microsoft to release .NET 4.0 2013 Reactive Manifesto Initial Akka release 2014 RxJava 1.0 2015 Reactive Streams 1.0 Project Reactor 2.0 2016 RxJava 2.0 Akka Streams 1.0 Ratpack Spring WebFlux Micronaut Today RSocket Reactive Mongo Lettuce Cassandra vert.x Lagom Apple Servicetalk Helidon RxJava 3.0 Project Reactor 3.0
  • 5. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Programming Models Have Changed ● Reactive applications typically stream-processing ● Push-based models ● Notifications, Events ● Is SQL the right choice for reactive applications? ● Depends on the Use-Case 5
  • 6. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Programming ● High-efficiency applications ● Fundamentally non-blocking ● No opinion on async ● Key differentiators: (pull-push) back pressure, flow control 6
  • 7. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Persistence ● ✅ Kafka ● ✅ MongoDB ● ✅ Cassandra ● ✅ Couchbase ● ✅ Redis ● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server* 7
  • 8. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Persistence ● ✅ Kafka ● ✅ MongoDB ● ✅ Cassandra ● ✅ Couchbase ● ✅ Redis ● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server* 8
  • 9. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non-blocking SQL Persistence (1/3) ● MySQL: X DevAPI (Document Store API): CompletableFuture ● vert.x Postgres Driver: Callback API ● jasync-sql: CompletableFuture ● Common API 🤕 9
  • 10. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non-blocking SQL Persistence (2/3) ● JDBC on ThreadPool ● RxJava JDBC ● Blocks still threads ● Project Loom: Production readiness unknown ● Requires proper queuing and capacity controls 10
  • 11. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non-blocking SQL Persistence (3/3) ● ADBA (Asynchronous Database API) ● Standard-API ● Based heavily on CompletableFuture ● Discontinued in favor of Project Loom 11
  • 12. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 12 Standard API for reactive programming with SQL databases on the JVM
  • 13. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Project of
  • 14. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Design Principles ● Embrace Reactive Types and Patterns ● Low barrier to entry (depends on Reactive Streams and Java 8 only) ● Non-blocking, all the way to the database ● De-duplicate driver efforts ● Documented specification ● Shrink the driver SPI ● Enable multiple "humane" APIs 14
  • 15. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Simple Select 15 Publisher<String> values = connectionFactory.create() .flatMapMany(conn -> conn.createStatement("SELECT value FROM test") .execute() .flatMap(result -> result.map((row, metadata) -> row.get("value", String.class))))
  • 16. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC 0.8 ● Stable release ● End-to-end reactive non-blocking database communication ● Batching ● BLOB/CLOB ● Extensive Type Conversion ● Savepoints ● Transactions ● Leveraging Database-specific features ● ServiceLoader-based Driver discovery ● Connection URLs ● Categorized exceptions (Bad grammar, Data integrity violation, …) 16
  • 17. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC 0.9 / 1.0 ● Evolution of the specification ● Extended transaction spec ● Improved In/Out Parameter Bindings ● Investigation on stored procedures ● No real demand so far ● Scheduled for 2021 17
  • 18. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC Ecosystem ● Specification document ● R2DBC SPI ● R2DBC Proxy ● Connection Pooling ● Client Implementations ● Spring ● Querydsl ● R2DBC Migrate ● Kotysa ● Testcontainers ● Driver Community ● Google Cloud Spanner ● H2 ● Microsoft SQL Server ● MySQL Driver (r2dbc-mysql, jasync-sql) ● MariaDB ● PostgreSQL ● SAP Hana ● Oracle (work in progress) ● DB2 (work in progress) 18
  • 19. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Community Projects ● Specification document ● R2DBC SPI ● R2DBC Proxy ● Connection Pooling ● Client Implementations ● Spring ● Querydsl ● R2DBC Migrate ● Kotysa ● Testcontainers ● Driver Community ● Google Cloud Spanner ● H2 ● Microsoft SQL Server ● MySQL Driver (r2dbc-mysql, jasync-sql) ● MariaDB ● PostgreSQL ● SAP Hana ● Oracle (work in progress) ● DB2 (work in progress) 19
  • 20. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC Clients: Work in Progress ● MyBatis (#1444) ● JDBI (#1454) ● jOOQ (#6298) ● Querydsl (#2468) ● Liquibase (CORE-3419) ● Flyway (#2502) ● Exposed (#456) ● Micronaut (#416) ● Go vote for a client you want to see happen. 20
  • 21. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ What R2DBC gives you ● Move Thread congestion out of JVM ● Achieve more with less Threads ● Doesn’t change law of physics ● Follow well-known SQL database interaction patterns ● Database laws still apply ● Obey wire protocol rules ● ACID rules 21
  • 22. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring ❤ R2DBC
  • 23. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring and R2DBC ● 2018/2019 ● First steps with Spring Data R2DBC 1.0 ● 2020 ● Migration of core R2DBC support from Spring Data to Spring Framework 5.3 ● Deprecations in Spring Data R2DBC 1.2 23
  • 24. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring R2DBC ● Central class: DatabaseClient ● BindMarker SPI ● Reactive Transaction Manager ● Schema initialization support ● ConnectionFactory implementations (e.g. AbstractRoutingConnectionFactory) 24
  • 25. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DatabaseClient DatabaseClient client = DatabaseClient.create(connectionFactory); Flux<Person> people = client .sql("SELECT firstname, lastname FROM person WHERE age > :age") .bind("age", 42) .filter(statement -> statement.fetchSize(20)) .map(row -> new Person(row.get("firstname", String.class), row.get("lastname", String.class))) .all(); 25
  • 26. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ConnectionFactoryInitializer @Bean ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) { ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer(); initializer.setConnectionFactory(connectionFactory); initializer.setDatabasePopulator(new ResourceDatabasePopulator( new ClassPathResource("schema.sql"))); return initializer; } 26
  • 27. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Data R2DBC ● Mapped entity support through R2dbcEntityOperations ● Query and Update objects ● Dialect-awareness ● Repository abstraction ● Sorry, no mapped relations yet 27
  • 28. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2dbcEntityTemplate R2dbcEntityTemplate entityTemplate = …; Flux<Person> people = entityTemplate.select(Person.class) .from("people") .matching(query(where("age").greaterThan(42)) .limit(10) .offset(20) .sort(by("firstname"))) .all(); 28
  • 29. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2dbcEntityTemplate R2dbcEntityTemplate entityTemplate = …; Flux<Person> people = entityTemplate.select(Person.class) .from("people") .matching(query(where("age").greaterThan(42)) .limit(10) .offset(20) .sort(by("firstname"))) .all(); 29 query(where("age").greaterThan(42)) .limit(10) .offset(20) .sort(by("firstname"))
  • 30. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Repositories interface PersonRepository extends ReactiveSortingRepository<Person, Integer> { Flux<Person> findByFirstnameContains(String name); Flux<Person> findFirst10By(); Flux<Person> findAllByOrderByLastname(Pageable pageable); @Modifying @Query("DELETE FROM person WHERE age = :age") Mono<Void> deleteAllByAge(int age); @Modifying @Query("DELETE FROM person") Mono<Integer> deleteAllAndReturnCount(); } 30
  • 31. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Data R2DBC 1.2: New and Noteworthy ● Entity Callbacks ● Before/After Convert, Before/After Save ● Auditing ● SpEL Context Extensions ● Enum value revision ● Repository metrics SPI 31
  • 32. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Entity Callbacks @FunctionalInterface interface BeforeConvertCallback<T> extends EntityCallback<T> { Publisher<T> onBeforeConvert(T entity, SqlIdentifier table); } 32
  • 33. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Entity Callback in Action @Bean BeforeConvertCallback<Person> autogeneratedId(DatabaseClient client) { return (entity, table) -> { if (entity.getId() == null) { return client.sql("SELECT nextval('person_seq')") .map(row -> row.get(0, Integer.class)) .first() .map(entity::withId); } return Mono.just(entity); }; } 33
  • 34. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Outlook: Spring Data R2DBC 2.0 ● Closer alignment of Spring Data JDBC and Spring Data R2DBC ● Evolution of Spring Data Relational 34
  • 36. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Resources ● Website https://r2dbc.io ● Twitter @r2dbc ● GitHub https://github.com/r2dbc ● Mailing List https://groups.google.com/forum/ #!forum/r2dbc ● Monthly Call 1st Friday of Month 0630 PT/0930 ET/1530 CET 36