SpringBoot整合MyBatis实现分库分表方案

SpringBoot整合MyBatis实现分库分表方案

SpringBoot整合Mybatis实现分库分表查询, 这里不讲解SpringBoot如何整合MyBatis ,只讲解SpringBoot整合MyBatis下的实现分库分表的实现方案。

#大概的实现思路

  • 我们知道MyBatis的mapper对象是通过动态代理创建出来的,通过SqlSession中的getMapper方法来获取mapper的实例对象,SqlSession是通过SqlSessionFactory对象创建出来,SqlSessionFactory中维护着DataSource对象, 如果我们有很多库,我们是不是可以创建多个SqlSessionFactory,不同的数据源来创建多个SqlSessionFactory对象然后维护于Spring容器中。当我们需要指定库查询的时候,只需要找到Spring容器中不同的SqlSessionFactory的Bean对象是不是就可以实现数据源路由切换。

比如我有一个租户系统,每个租户数据都放在不同的库里面,每个租户和Spring容器中的SqlSessionFactory有所关联 ,当我们租户登录的时候找到SqlSessionFactory对象,这样以后的查询使用SqlSessionFactory去查询,这样是不是就可以实现多租户分库案例。

在这里插入图片描述
上图是一个我从数据库查询出来的多数据源配置信息,我们拿到这些信息,然后每一个都创建一个DataSource对象,然后在创建成美一个SqlSessionFactory对象,最终我们创建SqlSessionTemplate对象,因为我们最终只要拿到SqlSessionTemplate对象去执行相应操作就好了.
在这里插入图片描述
上图是数据库中配置数据库源信息,beanName对象 就是我们Spring容器中实例的名字,比如我们获取容器中名字为base1,就是获取到了这条记录创建的数据源。
在这里插入图片描述
在这里插入图片描述
如上两个截图是一个执行的aop,这里我们切点是Mapper对象,我们先拿到Mapper注解上是否存在@Sharding注解,如果存在我们就会走下面的分库,我们会拿到当前登录的用户数据,拿到对象的beanName字段,然后在容器中找到对应的SpringTemplate对象,然后就像相对应的操作。
在这里插入图片描述
这里测试用例,是用了50的并发去测试的,测试性能结果还算可行,我这里查询了50个库,每个库中就一个表 ,这个表有100多万数据,50个库 相当于5000多万数据测试了。性能不错,查询秒级以内。
在这里插入图片描述
这里还是有个问题,如果使用了事务,这个事务还是已默认的数据源去执行的。
在这里插入图片描述
源码github地址: https://github.com/yangzh994/mysql-shardingV2

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值