Spring Boot 2.7 WebFlux R2DBC使用jasync-r2dbc-mysql报错排查
问题根因
抛出AbstractMethodError的核心原因是jasync-r2dbc-mysql 2.0.8与Spring Boot 2.7.0内置的R2DBC SPI版本不兼容:
- Spring Boot 2.7.0将R2DBC SPI升级到1.0.0.RELEASE,该版本对
RowMetadata接口做了破坏性调整,原getColumnMetadatas()方法的签名、实现逻辑均有变更 - jasync-r2dbc-mysql 2.0.8是适配旧版R2DBC 0.9.x SPI的版本,没有实现新版SPI要求的方法,类加载时就会抛出抽象方法不存在的错误
之前使用原生r2dbc-mysql出现的3秒+IO延迟、cancel()方法卡顿问题,是旧版r2dbc-mysql(0.9.x及以下)的已知缺陷:旧版本没有对取消信号做IO线程级的快速传播,cancel触发后必须等待当前数据库IO操作完成才会返回,加上默认连接池配置不合理,高并发下很容易出现请求堆积超时。
可直接落地的解决方案
方案一:使用兼容版本的jasync-r2dbc-mysql驱动(推荐,同时解决性能+兼容性问题)
- 修改pom.xml中的R2DBC相关依赖,排除Spring Boot默认引入的旧版r2dbc-mysql,引入适配R2DBC 1.0 SPI的jasync驱动版本:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> <exclusions> <!-- 移除默认带的旧版r2dbc-mysql驱动 --> <exclusion> <groupId>dev.miku</groupId> <artifactId>r2dbc-mysql</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入兼容Spring Boot 2.7.x的jasync驱动 --> <dependency> <groupId>com.github.jasync-sql</groupId> <artifactId>jasync-r2dbc-mysql</artifactId> <version>2.1.24</version> </dependency> </dependencies>
- 不需要修改任何基于
ReactiveCrudRepository编写的业务代码,直接启动即可。该版本驱动自带优化过的连接池,cancel信号可以直接中断正在执行的IO操作,不会出现3秒卡顿问题,普通CRUD查询耗时可稳定在10ms以内。
方案二:升级原生r2dbc-mysql驱动(不想换驱动时使用)
如果不想更换为jasync驱动,直接将原生r2dbc-mysql版本升级到1.0.2及以上,同时调整连接池配置即可解决性能问题,pom依赖配置如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency> <dependency> <groupId>dev.miku</groupId> <artifactId>r2dbc-mysql</artifactId> <version>1.0.2</version> </dependency>
在application.yml中添加以下连接池配置优化性能:
spring: r2dbc: pool: max-acquire-time: 300ms initial-size: 10 max-size: 50 validation-query: SELECT 1 properties: mysql: useServerPrepStmts: true zeroDateTimeBehavior: convertToNull
避坑提示
- Spring Boot 2.7.x绑定的R2DBC SPI版本为1.0.0.RELEASE,所有R2DBC相关驱动必须选择适配该SPI版本的发行版,不要跨大版本混用
- 使用jasync-r2dbc-mysql时不需要额外引入r2dbc-pool依赖,驱动自带的连接池会自动适配Spring Data R2DBC的连接池配置接口
- 更换驱动后不需要修改
ReactiveCrudRepository或DatabaseClient的业务代码,R2DBC SPI层做了统一抽象,上层逻辑无感知
内容的提问来源于stack exchange,提问作者J. Hu
相关产品推荐
相关产品推荐

