当前位置: 首页 > 后端技术 > Java

R2dbcMybatis集成

时间:2023-04-01 22:18:30 Java

R2dbcMybatis集成涉及框架r2dbc-spir2dbc-poolreactor-coremybatismybatis-dynamic-sqlspring-r2dbc背景原因介入Reactive技术栈时,原mybatis框架是reactive的,集成Transaction遇到的技术问题社区中的许多响应式应用程序框架都研究了困难。除了Spring-R2DBC,大部分的事务处理和连接管理还停留在阻塞式处理的思路上。实现react并没有真正的技术难点1.由于Reactive编程模型相对于传统编程模型发生了变化,ThreadLocal在reactive环境下不能再使用,导致连接无法缓存,导致无法在业务流程缓存连接2上安装事务。r2dbc的connection虽然提供了事务操作,但是在让mybatis框架响应式的过程中,通过Context合理的缓存Connection并不容易。背景知识Connection用于创建语句,操作事物等ConnectionFactory创建connectionReactive-Mybatis在整合r2dbc和mybatis时,有一系列的问题需要适配:ThreadLocal在reactive项目中不能使用,需要更换withContext,用来缓存ConnectionReactive,属于数据流处理的形式。Mybatis中原有的处理逻辑是Blocking操作,需要更换保留原有的No-Blocking的参数绑定和结果解析方案,适配reactive流处理过程中的r2dbc-spi驱动,PreparedStatement中的placeholders,不同的驱动有不同的实现,统一使用JDBC?placeholder,placeholder是由driver翻译过来的,这里需要转换为framework适配,否则适配不同的r2dbc驱动由于reactive本身有缓存性质,所以需要剥离mybatis中的cache来适配r2dbcData-Type,否则数据映射不成功。在集成r2dbcthings的时候,需要使用动态代理将Connection缓存到Context中,保证在一个thing中,Connection是相同的。这样在解析Transaction的返回结果集的时候需要转换一下思路。由于数据是以数据流的形式返回的,在对结果集进行合并解析时,需要对解析后的数据进行适当的缓存,这样才能保留mybatis原有的一对多映射功能。在适配SelectKey函数时,将原来的一些前后操作都转移到执行器上进行操作。原有的SelectKey功能被阻塞,需要将流程贯穿整个executor流程,才能保留前后的操作。由于r2dbc的限制,还是只能返回自生成自增主键,或者返回在将Reactive-Mybatis-Spring集成到Spring的过程中,需要将Executor挂在Spring的事务管理器上,交给Spring管理,通过ConnectionFactoryUtils.currentConnectionFactory(connectionFactory)Spring判断当前Context是否有事务管理提供TransactionAwareConnectionFactoryProxy来代理事物。您需要将ReactiveSqlSession中使用的ConnectionFactory替换为TransactionAwareConnectionFactoryProxy以将其与Spring的事务管理器一起使用。具体支持的功能请移步到reactive-mybatis-support,已经发布到中央仓库,测试MySQL/PostgreSQL/H2/Mssql/Oracle。相关源代码维护在GitHub上。欢迎Issue和Starreactive-mybatis-support