webflux的好帮手-r2dbc

时间:2024-03-29 07:44:30

首先,为什么说r2dbc是webflux的好帮手。因为webflux虽然是响应式的,但是奈何jdbc是基于阻塞IO实现的,所以真正的威力发挥不出来。有了r2dbc,不再受限于数据库连接了,真正打通了响应式应用的任督二脉,性能才被释放。

当然,除了Spring推出的r2dbc协议,还有Oracle官方的ADBA,只不过后者进展缓慢。而在Webflux急需响应式数据库驱动协议的支持的背景下,Spring自己动手了...有兴趣的同学可以到r2dbc的官方网站看看,目前已经支持该协议的数据库,在官网上赫然写着:

webflux的好帮手-r2dbc

最初的PostgreSQL 、H2、MSSQL ,现在MariaDB、MySQL,相信随着r2dbc的不断完善,会有越来越多的数据库加入!这样看,真的有点替官方的ADBA担心呀...毕竟Spring在Java开发的影响力,大家也都看得到的。

这些r2dbc的驱动中,有一个引起了我的注意,MySQL的驱动,竟然是一位个人开发者开发的,而且被Spring官方所认可使用!不相信的同学,可以看看SpringBoot的pom文件,找r2dbc-mysql,你会发现groupId有点奇怪。该作者的github

 

 

废话不多说,先来看看springboot对r2dbc的强大支持。

本着约定大于配置的基本原则,先来看看spring.factories
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\

 

 

R2dbcDataAutoConfiguration

DatabaseClient

数据库客户端,提供类似于JdbcTemplate/mybatis的SqlSession之类的能力

R2dbcMappingContext

R2dbc的映射上下文,这也是r2dbc的Repository的基础,JPA能力来源。

值得注意的是,它继承于RelationalMappingContext,也就是说是关系型数据库映射的适配。实际上,从我们的依赖包也能看出些许猫腻,mysql-connector和r2dbc-mysql,值得玩味吧。关系型数据还是关系型,在原有的连接的基础上,进行了r2dbc协议支持。

ReactiveDataAccessStrategy 响应式数据访问策略

R2dbcCustomConversions

定制化的结果集转换器,说白了就是类型转换。默认的可参考静态代码块: R2dbcCustomConversions.java:27

R2dbcExceptionTranslator 异常转换器

 

R2dbcRepositoriesAutoConfiguration

@Import(R2dbcRepositoriesAutoConfigureRegistrar.class)

 

R2dbcRepositoriesAutoConfigureRegistrar干啥了呢,就引入了这个注解:

@EnableR2dbcRepositories

这个注解又干啥了呢?

@Import(R2dbcRepositoriesRegistrar.class)

R2dbcRepositoriesRegistrar在AnnotationRepositoryConfigurationSource的协助***册Repository

 

R2dbcTransactionManagerAutoConfiguration

R2dbcTransactionManager

 

R2dbcAutoConfiguration

@EnableConfigurationProperties(R2dbcProperties.class)

看到这个,懂了没?直接通过属性就能自动声明ConnectionFactory了!

@Import({ ConnectionFactoryConfigurations.Pool.class, ConnectionFactoryConfigurations.Generic.class })

 

ConnectionFactoryConfigurations.Pool

ConnectionPool

ConnectionFactoryConfigurations.Generic

ConnectionFactory

 

这2货的区别在于,前者有连接池支持,而后者具备。有可能你的数据库在压测下扛不住,就是这点区别!这里就看看连接池支持的。

org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBuilder#of

>org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBuilder.ConnectionFactoryOptionsInitializer#initializeOptions

如果存在Properties中存在url则直接由url创建ConnectionFactory:

ConnectionFactoryOptions.parse(properties.getUrl()),他会通过url解析出来schema

否则,寻找内存数据库H2。这意味着,只要你填了url,SpringBoot就能自动帮你配置ConnectionFactory!

不存在内存数据,则ConnectionFactoryBeanCreationException抛出创建异常。

 

最后奉上本人的一个webflux-r2dbc的小demo,谢谢各位。