首先,为什么说r2dbc是webflux的好帮手。因为webflux虽然是响应式的,但是奈何jdbc是基于阻塞IO实现的,所以真正的威力发挥不出来。有了r2dbc,不再受限于数据库连接了,真正打通了响应式应用的任督二脉,性能才被释放。
当然,除了Spring推出的r2dbc协议,还有Oracle官方的ADBA,只不过后者进展缓慢。而在Webflux急需响应式数据库驱动协议的支持的背景下,Spring自己动手了...有兴趣的同学可以到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,谢谢各位。