R2dbc Mybatis 整合
波及到框架
r2dbc-spi
r2dbc-pool
reactor-core
mybatis
mybatis-dynamic-sql
spring-r2dbc
背景起因
- 在染指Reactive技术栈时,将原有的
mybatis
框架 reactive 化的过程中,整合Transaction遇到的技术难点 - 考查过社区很多 reactive 利用框架,除了
Spring-R2DBC
外,大部分事物解决,和connection治理,都还停留在阻塞式解决的思路中。并没有真正的实现reactive化
技术难点
- 1 . 因为Reactive的编程模式绝对于传统编程模式的变动,
ThreadLocal
已无奈在reactive环境中应用,造成connection无奈缓存,导致在业务流程上挂载事务处理时,无奈缓存connection - 2 . 尽管r2dbc的connection提供了transaction操作,但要将
mybatis
框架 reactive 化的过程中,通过Context
正当的缓存Connection
不太好实现
背景常识
-
Connection
- 用于创立statement,操作事物等
-
ConnectionFactory
- 创立connection
Reactive-Mybatis
-
在整合
r2dbc
和mybatis
时,有一系列问题须要适配:- reactive我的项目中无奈应用ThreadLocal,须要替换为
Context
,用于缓存Connection
- reactive,属于数据流解决的模式,原有Mybatis中的解决逻辑是Blocking操作,须要替换为No-Blocking
- 保留原有参数绑定和后果解析计划,并适配到reactive流处理过程中
r2dbc-spi
驱动中,PreparedStatement中的占位符,不同驱动有不同的实现,而JDBC
对立应用?
为占位符,由驱动翻译占位符,这里须要转换为框架适配,否则适配不同的r2dbc
驱动- 因为reactive自身就有cache性质,须要将
mybatis
中的cache剥离掉 - 适配
r2dbc
Data-Type,否则数据映射不胜利
- reactive我的项目中无奈应用ThreadLocal,须要替换为
- 在整合
r2dbc
事物时,须要应用动静代理来实现缓存Connection
到Context
中,并保障,在一个事物中,Connection
是同一个,这样能力实现Transaction
- 在解析返回后果集时,须要切换思路,因为数据是依照数据流的模式返回的,那么在合并和解析后果集时,须要正当缓存已解析的数据,从而能够保留原有
mybatis
的一对多映射性能 - 在适配
SelectKey
性能时,须要将原有的before
和after
操作,转移到executor中操作,原有的SelectKey
性能是阻塞的,须要将流程贯通到整个executor
过程中,能力保留before
和after
操作 - 因为
r2dbc
的限度,要么只返回自生成自增主键
,要么返回影响行数
Reactive-Mybatis-Spring
- 整合到Spring的过程中,须要将Executor挂在到Spring的事物管理器上,并交由Spring治理
- Spring通过
ConnectionFactoryUtils.currentConnectionFactory(connectionFactory)
来判断,以后Context是否有事物治理 - Spring提供了
TransactionAwareConnectionFactoryProxy
来代理事物,须要将ReactiveSqlSession
中应用的ConnectionFactory
替换为TransactionAwareConnectionFactoryProxy
能力和Spring的事物管理器一起应用
相干信息
- 已通过Mybatis源码,适配了R2DBC,保留Mybatis原用性能,尽可能的保障我的项目顺利迁徙。具体反对的性能,请移步 reactive-mybatis-support
- 已公布到地方仓库,因为集体工夫无限,只测试了
MySQL
和PostgreSQL
(局部),其余数据库尚未测试
相干源码保护在GitHub,欢送Issue和Star reactive-mybatis-support
发表回复