当前位置: 首页 > 网络应用技术

Springboot Multi -Data源交易解决方案

时间:2023-03-06 12:05:31 网络应用技术

  以前,一篇文章为Springboot的Multi -Data源动态注册开关提供了集成计划。在随后的使用过程中,发现交易控制中有多个错误。

  多数据源切换过程的结构图如下所示,包括几个组成元素

  将@transitional注释添加到控制器后,数据源切换将失败,并且只有主库将运行。查询数据后,解决方案是在交易控件截取之前将切割表面的顺序设置为-1的执行顺序。在以下内容后,交易控制权或主要库操作无效。

  在分析了代码后,我发现AbsTractRoutingAsource仅负责提供GetConnection级别,但是无法跟踪连接的后续操作。项目框架Mybatis和JDBCtemplate混合了。在春季,其中三个逻辑级别的后续操作是三个的逻辑级别。相同,JDBCTEMPLATE代码相对简单,因此请使用它作为进一步分析的入口点

  通过断点调试,SQL语句的执行最终将属于执行方法。该方法开始通过dataSourceures.getConnection获得连接。这是我们需要遵循的地方。分析的具体逻辑

  第一行获得的连接持有人是一个与当前事务相对应的线程对象,因为我们知道事务的本质是SQL Internal SQL对应于相同的数据库连接。对于不同的嵌套业务方法,唯一的事情是同一件事是当前线程ID是一致的,因此我们将连接与线程结合以实现交易控制

  单击“ getResource方法

  在这一点上,我们似乎找到了一些东西。以前,DynamicDataSource将数据源直接分配给JDBCTEMPLATECHU实例化设置,因此每次在事物中获得连接基础时,DynamicIcdatAsource每次都相同!

  随后,我找到了Mybatis的相关信息。事务控制的默认实现是SpringManagedTransaction。检查源代码后,我找到了熟悉的数据源。getConnection证明了我们的分析方向正确

  自定义操作类继承了JDBCTEMPLATE重写GetDataSource,并指定了我们获得的相应的键,我们可以将相应的键到实际切换库的数据源对象。

  自定义的交易操作类别,实现交易接口,替换过渡因素。这里的实现与在线解决方案略有不同。Internet是Internet上的三个变量。连接),但是该框架需要由Mybatis和JDBCtemplate统一。Mybatis由连接级别控制。JDBCTEMPLATE由数据源级别控制,因此所有键值都用于存储存储。

  交易中动态切换的问题得到了解决,但仅用于主要数据库事务。如果您还需要交易的特征才能从库中运行,则在注册数据源时需要为每个数据源手动注册交易管理。

  主库是修复的,您可以直接在配置bean中声明MasterTransitationManage并将其设置为默认值

  我们可以从库的事务管理器中获取数据源初始化对象,然后将一个示例对象注册到弹簧容器

  只需指定 @Transitation的过渡效果名称

  解决了这个问题,并找到了许多信息和解决方案。他们中的许多人只有参考或特异性,因此您仍然需要掌握问题的核心以及一些源代码跟踪。从过渡 - 连接 - 局部线程之间的关系,我们可以找到正确调查的方向

  在随后实施了XA两阶段提交的全球事务之后,基于JMS(Atomikos)。Druidxadatasrouce的使用泄露了Druid和Atomikos线池的披露。