--- name: mariadb-connector-r2dbc-install description: "Installing and configuring MariaDB Connector/R2DBC, the reactive non-blocking driver for MariaDB — the Maven coordinates `org.mariadb:r2dbc-mariadb`, the fact that it implements R2DBC rather than JDBC so connections come from `ConnectionFactories.get()` with an `r2dbc:mariadb://` URL and never from `DriverManager`; that connection pooling is a separate `io.r2dbc:r2dbc-pool` dependency rather than a built-in; that `sslMode` defaults to disabled so TLS must be requested explicitly and then tuned with `serverSslCert` or a truststore; and the parameter names that differ from the JDBC driver, notably `username` and `socket`. Use when adding the driver to a build, wiring a `ConnectionFactory`, or configuring pooling and TLS." --- # MariaDB Connector/R2DBC: Installation and Configuration *Last updated: 2026-08-10* MariaDB Connector/R2DBC is the reactive driver for MariaDB: pure Java, built on Reactor and Netty, implementing the R2DBC SPI rather than JDBC. This skill covers adding it to a build and configuring it. For writing reactive code against it, see **`mariadb-connector-r2dbc-usage`**. > **Default context:** Assume the **1.4** stable line unless the user states otherwise. Connector versions are independent of the MariaDB server version. ## What LLMs Often Miss | If the agent writes / assumes… | …prefer the MariaDB form | |---|---| | Adds `org.mariadb.jdbc:mariadb-java-client` for a reactive application | Different artifact, different SPI. R2DBC is **`org.mariadb:r2dbc-mariadb`** — note the shorter group ID. The JDBC driver cannot serve an R2DBC `ConnectionFactory` | | Calls `DriverManager.getConnection("r2dbc:mariadb://…")` | R2DBC has no `DriverManager`. Obtain a factory with **`ConnectionFactories.get("r2dbc:mariadb://…")`** or build a `MariadbConnectionConfiguration` and pass it to `MariadbConnectionFactory` | | Writes a `jdbc:mariadb://` URL | The R2DBC scheme is **`r2dbc:mariadb://`**; the registered driver identifier is `mariadb` | | Expects a built-in pool, or reaches for the JDBC driver's `MariaDbPoolDataSource` | Pooling in R2DBC is a **separate dependency**, `io.r2dbc:r2dbc-pool`, which wraps any `ConnectionFactory`. Nothing pools by default | | Uses `user=` in the URL or configuration | The parameter is **`username`**. Similarly the Unix socket parameter is **`socket`**, not `socketPath` or `localSocket` | | Sets `serverSslCert` and assumes TLS is on | **`sslMode` defaults to `DISABLE`.** Nothing is encrypted until `sslMode` is set to `trust`, `verify-ca`, or `verify-full` | | Ships a private CA and expects the JVM's public CAs to stop applying | The driver falls back to the system truststore. Set **`fallbackToSystemTrustStore=false`** (and `fallbackToSystemKeyStore=false` for client certificates) to make trust exclusive | | Blocks on the returned `Publisher` — `.block()` in request-handling code | The whole point is non-blocking. A `Mono`/`Flux` must be composed and returned, not resolved; blocking on a Reactor thread can deadlock the event loop | | Targets a recent Java baseline and drops Java 8 support from the build | The connector is compiled for **Java 8**, so it does not force the application's baseline upward | | Mixes an arbitrary `r2dbc-spi` version into the build | The driver is built against a specific R2DBC SPI release (**1.0.0.RELEASE** on the 1.4 line). Let Maven resolve it transitively rather than pinning a different one | | Assumes prepared statements behave as they do in the JDBC driver | Server-side prepared statements are governed by **`useServerPrepStmts`** and cached according to **`prepareCacheSize`** — set them deliberately for a reactive workload | ## Installing ### Maven ```xml org.mariadb r2dbc-mariadb 1.4.2 io.r2dbc r2dbc-pool 1.0.2.RELEASE ``` ### Gradle ```groovy implementation 'org.mariadb:r2dbc-mariadb:1.4.2' implementation 'io.r2dbc:r2dbc-pool:1.0.2.RELEASE' ``` Reactor and Netty arrive transitively. A manual JAR install is possible — the driver and `r2dbc-pool` both need to be on the `CLASSPATH` — but a build tool is far less error-prone given the transitive graph. ## Configuration ### From a URL ```java ConnectionFactory factory = ConnectionFactories.get( "r2dbc:mariadb://app:secret@db.example.com:3306/appdb?sslMode=verify-full"); ``` ### Programmatically The builder makes the options discoverable and keeps credentials out of a URL string: ```java MariadbConnectionConfiguration conf = MariadbConnectionConfiguration.builder() .host("db.example.com") .port(3306) .username("app") // username, not user .password("secret") .database("appdb") .connectTimeout(Duration.ofSeconds(10)) .useServerPrepStmts(true) .build(); MariadbConnectionFactory factory = new MariadbConnectionFactory(conf); ``` For a local server, replace host and port with `.socket("/var/run/mysqld/mysqld.sock")`. ### TLS ```java MariadbConnectionConfiguration.builder() .host("db.example.com").username("app").password("secret") .sslMode(SslMode.VERIFY_FULL) .serverSslCert("/etc/ssl/certs/ca.pem") .build(); ``` | Parameter | Purpose | |---|---| | `sslMode` | `DISABLE` (default), `TRUST`, `VERIFY_CA`, `VERIFY_FULL`, `TUNNEL` | | `serverSslCert` | CA or server certificate to trust | | `clientSslCert`, `clientSslKey`, `clientSslPassword` | Client certificate for mutual TLS | | `tlsProtocol` | Allowed protocol versions | | `fallbackToSystemTrustStore`, `fallbackToSystemKeyStore` | `false` disables the JVM-default fallback | | `sslContextBuilderCustomizer` | Escape hatch for anything the named options do not cover | ### Pooling ```java ConnectionPoolConfiguration poolConf = ConnectionPoolConfiguration.builder(factory) .maxSize(20) .maxIdleTime(Duration.ofMinutes(30)) .build(); ConnectionPool pool = new ConnectionPool(poolConf); ``` `ConnectionPool` is itself a `ConnectionFactory`, so the rest of the application is unaffected by whether pooling is present. ### Spring Data R2DBC With Spring Boot, the same driver is configured through `spring.r2dbc.url` and friends, and Spring builds the `ConnectionFactory`. The driver dependency and the URL scheme are unchanged; only the wiring moves into configuration properties. ## See Also - **`mariadb-connector-r2dbc-usage`** — using the driver once installed: statements, parameter binding, result mapping, transactions, batches - **`mariadb-connector-j-install`** — the blocking JDBC alternative, when a reactive stack is not in play - Canonical reference on `mariadb.com/docs`, consult for edge cases not covered here: _This page is: Copyright © 2026 MariaDB. All rights reserved._