关于java:R2dbc-Mybatis-整合

9次阅读

共计 1703 个字符,预计需要花费 5 分钟才能阅读完成。

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

  • 在整合 r2dbcmybatis时,有一系列问题须要适配:

    • reactive 我的项目中无奈应用 ThreadLocal,须要替换为Context,用于缓存Connection
    • reactive,属于数据流解决的模式,原有 Mybatis 中的解决逻辑是 Blocking 操作,须要替换为 No-Blocking
    • 保留原有参数绑定和后果解析计划,并适配到 reactive 流处理过程中
    • r2dbc-spi驱动中,PreparedStatement 中的占位符,不同驱动有不同的实现,而 JDBC 对立应用 ? 为占位符,由驱动翻译占位符,这里须要转换为框架适配,否则适配不同的 r2dbc 驱动
    • 因为 reactive 自身就有 cache 性质,须要将 mybatis 中的 cache 剥离掉
    • 适配 r2dbc Data-Type,否则数据映射不胜利
  • 在整合 r2dbc 事物时,须要应用动静代理来实现缓存 ConnectionContext中,并保障,在一个事物中,Connection是同一个,这样能力实现Transaction
  • 在解析返回后果集时,须要切换思路,因为数据是依照数据流的模式返回的,那么在合并和解析后果集时,须要正当缓存已解析的数据,从而能够保留原有 mybatis 的一对多映射性能
  • 在适配 SelectKey 性能时,须要将原有的 beforeafter操作,转移到 executor 中操作,原有的 SelectKey 性能是阻塞的,须要将流程贯通到整个 executor 过程中,能力保留 beforeafter操作
  • 因为 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
  • 已公布到地方仓库,因为集体工夫无限,只测试了 MySQLPostgreSQL(局部), 其余数据库尚未测试

相干源码保护在 GitHub,欢送 Issue 和 Star reactive-mybatis-support

正文完
 0