J'ai utilisé Vert.x toolkit pour créer des applications réactives avec prise en charge des bases de données relationnelles comme MySQL et Postgres . Je sais que Spring fournit un support réactif pour certaines bases de données NoSQL comme Cassandra et Mongo, mais sont-elles disposées à fournir la même chose pour les bases de données relationnelles?
Spring Framework est une bibliothèque pour améliorer la productivité des développeurs, tout comme les projets de portefeuille de Spring tels que Spring Data, Spring Security, Spring Cloud.
Ces projets s'appuient sur des API existantes qui sont soit standardisées via un JSR ou un JEP, soit sur des bibliothèques qui se sont révélées utiles et largement utilisées. L'équipe Spring ne construit pas de pilotes pour les bases de données ou autres intégrations, cela dépend des fournisseurs de bases de données/pilotes.
Spring WebFlux est un bon exemple pour un module Spring typique. Il s'appuie sur des serveurs non bloquants existants (Project Reactor via netty, Undertow et Jetty). WebFlux fournit un conteneur d'exécution pour les applications réactives non bloquantes exploitant les composants Spring pour aider au développement et à l'exécution de ces applications.
Vert.x est un excellent exemple d'un environnement intégré qui fournit ses propres implémentations de bas niveau. Vert.x est fortement optimisé et un tel écosystème nécessite des intégrations optimisées. Vert.x a proposé ses propres implémentations pour diverses bases de données et fournit des API qui fonctionnent bien dans un contexte Vert.x, mais ces API ne sont pas JDBC.
Comme M-Razavi déjà mentionné, Java utilise JDBC pour s'intégrer aux bases de données relationnelles et JDBC est de nature bloquante - il n'y a rien de raisonnable à faire pour atténuer le blocage la nature de JDBC. Le déchargement des appels JDBC vers un pool Executor
(généralement Thread
) est limité dans son utilité car le pool finit par saturer de requêtes). TL; DR, il n'y a pas d'API disponible en plus de laquelle nous pourrions fournir une intégration de base de données relationnelle réactive.
M-Razavi déjà mentionné ADBA qui est une initiative d'Oracle pour fournir une API standardisée pour l'accès à la base de données asynchrone dans Java utilisant des contrats à terme. Tout dans ADBA est toujours en cours de réalisation et l'équipe derrière ADBA est heureuse d'obtenir des commentaires. Un groupe de gens de Postgres travaille sur un pilote Postgres ADBA qui peut être utilisé pour les premières expériences.
Cependant, ADBA est un objectif futur et je m'attends à ce que nous ne voyions pas ADBA publié avec Java 12.
Il existe quelques pilotes indépendants tels que Reactiverse's reactive-pg-client . Ces pilotes sont livrés avec une API spécifique au fournisseur et ne sont pas vraiment adaptés à une intégration plus large dans Spring. Nous aurions besoin de fournir des couches supplémentaires pour exposer une API commune, et de nouveaux pilotes ne pourraient pas être simplement connectés à votre application pour que cela fonctionne dès le départ ™. Avoir une API standard permet la connectivité, il y a donc une énorme valeur à avoir une API standard.
En l'absence d'une API standard et de la non-disponibilité des pilotes, une équipe de Pivotal a commencé à enquêter sur une API relationnelle réactive qui conviendrait parfaitement à des fins de programmation réactive. Ils ont proposé R2DBC qui signifie Reactive Relational Database Connectivity. À l'heure actuelle, R2DBC est un projet incubateur visant à évaluer la faisabilité et à entamer des discussions pour savoir si les fournisseurs de pilotes sont intéressés par la prise en charge de pilotes réactifs/non bloquants/asynchrones.
Pour l'instant, il existe trois implémentations de pilotes:
R2DBC est fourni avec une spécification API (r2dbc-spi
) et un client (r2dbc-client
) qui rend le SPI utilisable pour les applications. Nous avons commencé à explorer une intégration Spring Data R2DBC qui fournit des API réactives via un client de base de données et en prenant en charge les référentiels réactifs.
R2DBC et son écosystème sont encore jeunes et demandent des expériences et des commentaires pour collecter des cas d'utilisation et pour voir si une intégration de base de données relationnelle réactive aurait du sens.
À l'heure actuelle, vous pouvez utiliser R2DBC via Spring Data et l'extrait de code suivant montre l'utilisation de DatabaseClient
:
PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(…);
DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
Mono<Integer> count = databaseClient.execute()
.sql("INSERT INTO legoset (id, name, manual) VALUES($1, $2, $3)")
.bind("$1", 42055)
.bind("$2", "Description")
.bindNull("$3", Integer.class)
.fetch()
.rowsUpdated();
Flux<Map<String, Object>> rows = databaseClient.execute()
.sql("SELECT id, name, manual FROM legoset")
.fetch()
.all();
Spring WebFlux est un excellent moyen de créer une application non bloquante REST. Un problème que vous rencontrez lorsque vous commencez à travailler avec WebFlux est JDBC, car JDBC bloque. De nouvelles bases de données scolaires comme Cassandra ou Couchbase ont des pilotes non bloquants. Dans le cas de Couchbase, son pilote utilise RXJava. Il y a un effort pour créer des pilotes asynchrones pour les bases de données, ainsi que Oracle pour créer ADBA. Malheureusement, ce sont les premiers jours et si vous souhaitez parler à une base de données SQL sur la machine virtuelle Java, vous êtes bloqué avec un pilote de blocage.
En fait, Spring n'est pas responsable de fournir un pilote sans blocage pour les bases de données relationnelles.